ha-ah

로그, 게으른 로그

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2023년 12월호입니다.


PHP Annotated 11월호에 오신 것을 환영합니다! 11월호에서는 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달 동안 PHP 커뮤니티에서 가장 흥미로웠던 개발 동향을 되돌아봅니다.

Highlights

🎉 PHP 8.3.0 released!

https://www.php.net/releases/8.3/

PHP 8.3은 PHP 언어의 주요 업데이트입니다. 여기에는 입력형 클래스 상수, 읽기 전용 프로퍼티의 딥 복제, 랜덤 기능 추가 등 새로운 기능이 포함되어 있습니다. 항상 그렇듯이 성능 개선, 버그 수정, 전반적인 정리도 포함되어 있습니다.

PHP 8.3의 새로운 기능에 대한 자세한 목록은 릴리스 페이지마이그레이션 가이드에서 확인할 수 있으며, PHP 재단의 공지사항에서 릴리스에 대해 자세히 알아볼 수 있습니다.

PHP 8.3 설치 또는 업그레이드

  • Windows: 컴파일된 바이너리는 windows.php.net에서 찾을 수 있습니다. 또는 Chocolatey에서 제공되는 커뮤니티 빌드를 선택할 수 있습니다.
  • Ubuntu/Debian: PHP 8.3은 ondrej/php PPA에서 사용할 수 있습니다.
  • Fedora/RHEL/CentOS: Remi 저장소에서 소프트웨어 컬렉션(php83)으로 제공됩니다.
  • macOS: PHP 8.3은 홈브류를 통해 shivammathur/homebrew-php 탭을 사용하여 설치할 수 있습니다.
  • Docker: 이제 8.3 태그가 있는 PHP 8.3 이미지를 Docker Hub에서 사용할 수 있습니다.

PhpStorm은 이미 PHP 8.3을 지원합니다.

Freek, Brent, Roman과 함께하는 PHP 8.3 축하 스트림을 시청하세요.

⚠️ PHP 8.0의 수명이 다했습니다.

PHP 8.0.30은 PHP 8.0의 마지막 릴리스입니다. 더 이상 공식 보안 업데이트가 제공되지 않습니다.

PHP 8.1.26 and PHP 8.2.13 have been released

https://www.php.net/ChangeLog-8.php#8.1.26
https://www.php.net/ChangeLog-8.php#8.2.13

🐛 버그 수정 릴리스입니다.

PHP 8.1 브랜치는 마지막 버그 수정 릴리스인 PHP 8.1.27이 한 번 더 릴리스될 예정이며, 그 이후에는 보안 버그 수정만 릴리스됩니다.

🎂 PHP 재단 창립 2주년

PHP 재단은 2년 전에 설립되었습니다.
지난 한 해 동안 PHP 재단은 6명의 핵심 개발자의 작업을 지원했으며, PHP 언어에 상당한 기여를 했습니다.

PHP 재단의 2023년 11월 업데이트를 확인하세요.

OpenCollective 또는 GitHub Sponsors를 통해 PHP 재단을 지원하는 것도 고려해 보세요.

PHP Core

대부분의 핵심 소식은 PHP 재단에서 제공하는 PHP 코어 라운드업 시리즈에서 자세히 다루고 있으므로 몇 가지만 간략하게 언급하겠습니다:

📣 RFC: Resource to object conversion

RFC: resource를 object로 변환

resource는 오래전부터 객체로 대체된 PHP의 구식 데이터 구조입니다. resource를 object로 대체하는 작업은 2013년에 시작되었지만, 대부분의 확장 기능은 PHP 8.0이 출시되면서 마이그레이션되었습니다.

Máté Kocsis는 나머지 확장 기능을 마이그레이션하고 향후 개발을 위한 정책을 정의할 것을 제안합니다.

📣 RFC: Release cycle update

RFC: 릴리스 주기 업데이트

현재 PHP 버전의 수명은 3년입니다. 많은 사람이 이 기간이 너무 짧고 6개월인 사전 릴리스 단계가 지나치게 길다고 생각합니다.
PHP 8.3 릴리스 관리자인 Jakub Zelenka는 PHP 버전 수명을 4년(유지보수 2년, 보안 업데이트 2년)으로 늘리고 사전 릴리스 단계를 수정할 것을 제안합니다.

📣 RFC: Improve callbacks in ext/dom and ext/xsl

RFC: ext/dom 및 ext/xsl의 콜백 개선

Niels Dossche는 callable을 사용할 수 있는 XSLTProcessor::registerPHPFunctions()DOMXPath::registerPhpFunctions() 메서드를 허용할 것을 제안했습니다.

📣 RFC: Change how JIT is disabled by default

RFC: JIT가 기본적으로 비활성화되는 방식 변경

현재 JIT는 tracing 모드에서 실행 중이지만 opcache.jit_buffer_size0으로 설정되면 기본적으로 비활성화됩니다. RFC에서는 opcache.jit=disable을 설정함으로써 기본적으로 JIT를 비활성화하고, 기본 jit_buffer_size 값을 64m로 늘릴 것을 제안합니다.

📣 RFC: Final anonymous classes

RFC: Final 익명 클래스

RFC에서는 익명 클래스 사용 환경을 개선하기 위한 세 가지 옵션 중 하나를 제안합니다:

  1. 최종 익명 클래스에 대한 지원 추가(new final class {} 구문, 호환성 유지).
  2. 또는 모든 익명 클래스를 최종 클래스로 만드는 옵션 없이 기본적으로 모든 익명 클래스를 최종 클래스로 만듭니다(호환성 깨짐).
  3. 또는 모든 익명 클래스를 기본적으로 최종 클래스로 만들고, 선택적 open 키워드를 제공하여 최종 클래스가 아닌 것으로 만듭니다(Kotlin에서와 같이, new open class {}, 호환성 깨짐).

📣 RFC: Property Hooks

RFC: 프로퍼티 훅
이 RFC에서 Ilija Tovillo와 Larry Garfield는 get/set 함수를 사용하여 가상 프로퍼티를 선언할 것을 제안합니다.

설계 및 구문은 Kotlin과 가장 유사하지만 C# 및 Swift의 영향도 받습니다.

class User implements Named
{
private bool $isModified = false;

public function __construct(private string $first, private string $last) {}

public string $fullName {
get => $this->first . " " . $this->last;

set($value) => [$this->first, $this->last] = explode(' ', $value);
}
}

이 RFC의 흥미로운 부작용은 인터페이스에서 추상 속성을 선언할 수 있다는 점입니다:

abstract class A
{
abstract public string $readable { get; }
abstract protected string $writeable { set; }
abstract protected string $both { get; set; }
}

class C extends A
{
public string $readable;
protected string $readable;
protected string $writeable {
set => $field = $value;
}
public string $both;
}

Sjon Hortensius 덕분에 이미 3v4l.org에서 프로퍼티 훅을 사용해 볼 수 있습니다.

그리고 RFC Vote에 피드백을 제공할 수도 있습니다: Property Hooks

Tools

  • php-tui/php-tui – 의사(pseudo) 그래픽 UI를 갖춘 PHP로 콘솔 애플리케이션을 만들기 위한 프레임워크.

  • Crell/Serde – PHP 8을 위한 강력한 직렬화/역직렬화 라이브러리.

  • pestphp/pest-plugin-stresslessgrafana/k6 위에 구축된 Pest용 스트레스 부하 테스트 플러그인. 소개 비디오 📺 Stressless: PHP를 위한 스트레스 테스트를 참조하세요.

  • buggregator/server – XHprof 프로파일러, Symfony VarDumper 서버, SMTP 서버, Sentry 호환 서버, Monolog 서버, HTTP 요청 덤프 서버 등 PHP 애플리케이션을 위한 다양한 디버깅 기능을 제공하는 경량의 독립형 서버입니다.
    보다 편리한 PHP 디버깅을 위한 콘솔 미니 서버 및 도우미인 buggregator/trap이 함께 제공됩니다.

  • NoiseByNorthwest/php-spx – 웹 UI가 내장된 간단하고 직관적인 PHP 프로파일링 확장 프로그램입니다.

  • reliforp/reli-prof – PHP로 작성된 PHP용 샘플링 프로파일러 또는 메모리 프로파일러로, 프로세스 외부에서 PHP VM 실행에 대한 정보를 읽습니다. 대상 스크립트를 변경하거나 확장을 로드하지 않고도 스크립트에서 성능 병목 현상이나 메모리 누수를 찾을 수 있습니다.
    또는 PHP용 메모리 프로파일러 확장 프로그램인 arnaud-lb/php-memory-profiler를 사용해 볼 수도 있습니다. PHP 스크립트에서 메모리 누수를 찾는 데 도움이 됩니다.

  • saloonphp/xml-wrangler – XML을 쉽게 읽고 쓸 수 있도록 설계된 간단한 PHP 라이브러리. veewee/xml도 확인해보세요 - PHP에서 XML로 걱정 없이 작업하는 데 필요한 모든 도구를 제공하는 패키지입니다.

  • jolicode/JoliMarkdown – 마크다운 콘텐츠를 위한 구문 수정기. 자세한 내용은 졸리마크다운 소개를 읽어보세요.

  • cerbero90/lazy-json – 프레임워크에 구애받지 않고 모든 차원과 소스의 JSON 파일을 Laravel 지연 컬렉션에 재귀적으로 로드하는 패키지입니다.

  • staabm/phpstan-baseline-analysis – PHPStan 기준 파일을 분석하고 집계된 오류 추세 보고서를 생성합니다.

  • spiral/json-schema-generator – DTO(데이터 전송 객체) 클래스에서 JSON 스키마를 생성하는 기능을 제공합니다.

Symfony

Laravel

Other Frameworks

기타

Fun

Conferences

앞으로 개최될 PHP 행사에 참석하여 발표를 신청해 보세요:

가까운 PHP 밋업이 언제 열리는지 궁금하다면 Tomas Votruba가 운영하는 멋진 밋업 애그리게이터 friendsofphp.org를 이용해 보세요. php.net에 캘린더도 있습니다.

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2023년 10월호입니다.


PHP Annotated 10월호에 오신 것을 환영합니다! 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달간 PHP 커뮤니티에서 가장 흥미로운 발전 사항을 요약해드립니다.

Highlights

PHP 8.3.0 RC5 has been released

https://www.php.net/archive/2023.php#2023-10-26-1

또 다른 릴리스 후보가 일정에 따라 제공되었습니다. 여섯 번째 RC는 11월 9일에 예정되어 있으며, PHP 8.3의 최종 릴리스 전 마지막 RC가 될 것입니다.

PHP 8.3에 추가되는 기능에 대한 자세한 목록은 php.watch 또는 stitcher.io를 참조하세요.

다음은 곧 출시될 버전에 대한 다른 리소스입니다:

The PHP 8.1.25 and PHP 8.2.12 bug-fix releases are now available

PHP 8.1.25PHP 8.2.12 버그 수정 릴리스를 지금 사용할 수 있습니다.

What was that final noise about after all?

PHP 커뮤니티를 뒤흔든 또 다른 소동은 stevebauman/unfinalize 패키지의 출시로 인해 발생했습니다. 이 패키지는 vendor 디렉토리에 있는 모든 라이브러리 클래스를 살펴보고 모든 클래스와 메서드에서 final 키워드를 제거합니다.

일부 개발자는 공급업체 패키지에서 클래스를 확장할 수 있기를 원하기 때문에 Unfinalize를 사용하는 것입니다. 하지만 패키지 관리자가 클래스를 최종 클래스로 표시하는 데는 그럴 만한 이유가 있습니다: 일부 클래스나 메서드를 내부에 유지하여 사용자 코드를 손상시키지 않고 수정할 수 있기를 원하기 때문입니다.

이 주제는 CS 업계에서 새로운 것이 아니며 취약한 기본 클래스 문제(fragile base class problem)로 알려져 있습니다.

예를 들어 Kotlin과 같은 일부 프로그래밍 언어에서는 클래스가 기본적으로 최종적입니다 😱. 다른 언어에서는 수정자가 단지 규칙일 뿐이지만 이를 준수하지 않으면 종속성을 업데이트하면 애플리케이션이 손상될 수 있습니다.

바로 이 부분에서 PHP 8.3의 #[Override] 속성이 도움이 될 것입니다! 어떤 이유로 클래스에서 final을 제거한 다음 확장해야 하는 경우 PHP 8.3에서는 자식 클래스의 메소드를 #[Override]로 표시할 수 있습니다. 이 경우 적어도 기본 클래스 메서드가 변경되면 알림을 받을 수 있습니다.

다음은 이 주제에 대한 커뮤니티의 다른 글입니다:

PHP Core

대부분의 핵심 소식은 PHP 재단의 PHP 코어 라운드업 시리즈에서 자세히 다루고 있으므로 여기서는 몇 가지만 간략하게 언급하겠습니다:

✅ RFC: Increasing the default bcrypt cost

RFC: 기본 bcrypt 비용 상승

기본 BCrypt 비용을 늘리자는 Tim Düsterhus의 제안이 받아들여졌습니다. PHP 8.4에서는 비용이 12로 증가합니다.

보안 팁: bcrypt 라운드 늘리기 by Stephen Rees-Carter.

역자주:
Laravel에서도 기본 bcrypt 라운드를 12(성능과 보안 사이에서 최적의 지점)로 늘리는 PR이 머지되어 있습니다.
이 PR에는 관련된 논의를 따라갈 수 있는 링크와 대화가 많은데, 이중에는 bcrypt의 대안으로 알려졌던 Argon2에 관한 내용도 있습니다.

요약하자면, 일부 PHC 심사위원조차도 UX 허용 범위 연구(사용자당 인증 지연 500ms~1초)에 맞춰 인증 속도를 달성하려면 Argon2 제품군과 scrypt를 모두 “하향” 조정해야 한다는 점을 인정합니다. 동등한 인증 속도의 bcrypt보다 오프라인 공격에 대한 저항력이 떨어 집니다 (!)

역설적이게도 다중 사용자 대화형 로그인 사용 사례와 “여러 해시의 오프라인 공격 저항” 사례의 경우 적절하게 조정된 bcrypt가 여전히 우수합니다.

즉… 가장 단순하고 가장 이전 버전과 호환되는 옵션(bcrypt 비용 증가)은 현재 가장 안전한 옵션이기도 합니다.

✅ RFC: A new JIT implementation based on IR Framework

RFC: IR 프레임워크에 기반한 새로운 JIT 구현

새로운 JIT 구현을 병합하자는 제안이 만장일치로 받아들여졌습니다. PHP 8.4에는 완전히 새로운 빌트인 JIT가 적용될 예정입니다.
새로운 JIT에 대한 기술적 세부 사항을 공개하는 프레젠테이션: (PDF) 차세대 PHP용 JIT의 기반이 되는 IR JIT 프레임워크가 발표되었습니다.

📣 RFC: Rounding integers as int

RFC: 정수를 int로 반올림하기

현재 round, ceiling, floor 함수는 부동 소수점을 반환하지만 2^53 이상의 정수를 사용할 경우 정밀도 손실로 인해 예상치 못한 결과가 발생합니다.
Marc Bennewitz는 정수에 대해 반올림을 수행하고 가능한 경우 결과 정수를 반환할 것을 제안합니다.

📣 RFC: RFC1867 for non-POST HTTP verbs

RFC: 비-POST HTTP 동사를 위한 RFC1867

Ilija Tovilo는 기존 기능을 사용자 영역에 노출하는 새로운 함수 request_parse_body()를 추가하여 PUTPATCH와 같은 다른 HTTP 동사에 사용할 수 있도록 제안합니다.

Tools

  • dunglas/frankenphp - 필요한 모든 것을 갖춘 최신 PHP 애플리케이션 서버로 자동 HTTPS, HTTP/3, 103 Early Hints, Zstandard, PHP용 워커 모드 등을 제공합니다. Caddy를 기반으로 구축되었으며 가장 간단한 구성 프로세스를 제공합니다.

  • utopia-php/framework – 배우기 쉬운 빠르고 가벼운 마이크로 PHP 프레임워크입니다. Appwrite team에서 유지 관리합니다.

  • saloonphp/saloon 3.0.0 - 멋진 API 통합 및 SDK를 구축하기 위한 패키지입니다.

  • phpro/soap-client 3.0.0 - SOAP를 처리해야 하는 경우 유지 관리되지 않는 PHP 확장 프로그램을 사용하지 마세요. 대신 이 범용 PHP용 SOAP 클라이언트를 사용해 보세요. 새로운 옵션이 될 수도 있습니다.

  • flow-php/flow - Flow PHP는 강력하게 유형화된 데이터 처리 프레임워크입니다.
    Flow PHP 사용 예시

  • benholmen/defrag - 이 패키지는 90년대 조각 모음 도구 스타일의 출력을 PHPUnit 테스트 스위트로 생성합니다.
    defrag 실행 화면

  • flavioheleno/watchr - 도메인 이름과 TLS 인증서의 만료일을 확인하는 명령줄 유틸리티 및 GitHub Action입니다.

  • ad-aures/castopod - CodeIgniter로 구축된 오픈 소스 호스팅 플랫폼으로, 청중의 참여를 유도하고 소통하고자 하는 팟캐스터를 위해 만들어졌습니다.

PhpStorm

Symfony

Laravel

기타

strlen('👨‍👩‍👧‍👦'); 반환값 25.
mb_strlen('👨‍👩‍👧‍👦'); 반환값 7.
grapheme_strlen('👨‍👩‍👧‍👦');은 1을 반환합니다.

이 포스트에서 그 이유를 설명합니다.

Fun

Conferences

발표를 위해 방문하고 신청할 만한 다음 PHP 행사를 확인해 보세요:

  • Laracon AU – Sydney, Australia, November 16–17, 2023.
  • PHPCon Poland – Zawiercie, Poland, November 17–18, 2023.
  • SymfonyCon – Brussels, Belgium, December 7–8, 2023.
  • Laracon EU – Amsterdam, The Netherlands, Feb 5–6, 2024. CFP
  • PHP UK – London, UK, February 15–16, 2024. CFP
  • Laracon India – Udaipur, India, March 23–24, 2024. CFP 🆕
  • PHP[TEK] 2024 – Chicago, IL, USA, April 23–25, 2024. CFP 🆕
  • phpday 2024 – Verona, Italy, May 16–17, 2024. CFP 🆕

가까운 곳에서 다음 PHP 밋업이 언제 열리는지 궁금하다면 Tomas Votruba가 운영하는 멋진 밋업 애그리게이터 friendsofphp.org에서 확인할 수 있습니다. php.net - 이벤트에도 캘린더가 있습니다: 2023년 11월.

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2023년 9월호입니다.


PHP Annotated 9월호에 오신 것을 환영합니다! 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달간 PHP 커뮤니티에서 가장 흥미로운 발전 사항을 요약해드립니다.

Highlights

PHP 8.0.30, PHP 8.1.22, and PHP 8.2.9 have been released

PHP 8.0.30, PHP 8.1.22PHP 8.2.9가 릴리스되었습니다.

❗보안 릴리스이며 GHSA-3qrf-m4j2-pcrr(XML에서 외부 엔티티를 활성화하지 않고 로드) 및 GHSA-jqcx-ccgc-xwhv(phar_dir_read()의 버퍼 오버플로 및 초과 읽기)에 대한 수정이 포함되어 있습니다.

아직 PHP 7.*을 사용 중이라면 Remi의 리포지토리에 백포트된 보안 수정이 포함된 업데이트가 있습니다.

PHP 8.3.0RC2 has been released

PHP 8.3.0RC2가 출시되었습니다.

두 번째 RC가 일정에 따라 제공되었습니다. 다음 릴리스는 9월 28일에 예정된 RC3이며, PHP 8.3의 자세한 기능 목록은 php.watch 또는 stitcher.io에서 확인할 수 있습니다.

RFC Vote

RFC 투표

Brent Roose가 RFC에 대한 커뮤니티 투표를 위한 프로젝트를 시작했습니다.

공식 RFC 투표는 내부 개발자로 제한되지만, RFC 투표는 모든 사람에게 목소리를 제공합니다. 이는 공식 PHP RFC 결과에 직접적인 영향을 미치지는 않지만 의사 결정 과정에 참여하는 사람들에게 귀중한 자료가 될 수 있습니다.

brendt/rfc-vote 프로젝트는 오픈소스이며, 브렌트가 유튜브의 PHP Annotated에서 개발 전 과정을 스트리밍하고 있습니다.

WordPress 6.3 “Lionel” is out

워드프레스 6.3 “라이오넬”이 출시되었습니다.

무엇보다도 성능이 크게 개선되었습니다.

PhpStorm 2023.2 Is Available and the PhpStorm 2023.3 roadmap has been released

PhpStorm 2023.2 사용 가능하고PhpStorm 2023.3 로드맵이 출시되었습니다.

The PHP Foundation is hiring PHP core developers

PHP 재단에서 PHP 코어 개발자를 채용합니다.

PHP 코어에 기여하거나 확장 프로그램을 개발한 경험이 있고 유급 오픈소스 작업을 하고 싶다면 이번 기회가 좋은 기회가 될 수 있습니다.

지원서 접수는 9월 30일까지입니다.

CakePHP 5 is out

CakePHP 5 출시

이번 릴리스에서는 프레임워크 전반에 걸쳐 향상된 타입 힌트, PHPUnit 10.x로의 업그레이드, ORM의 새로운 열거형 유형 매핑 지원, PSR17 HTTP 팩토리 지원 등을 제공합니다.

Concerns over the European Union’s Cyber Resilience Act (CRA)

유럽연합의 사이버 복원력 법(CRA)에 대한 우려

WordPress, Drupal, Joomla! 및 TYPO3 프로젝트는 유럽에서 오픈소스의 더 나은 미래를 위해 CRA를 개선하는 방법에 대한 비판과 권고 사항을 담은 공개 서한을 EU 입법자들에게 보냈습니다.

개인, 중소기업, 기관은 CRA에 따른 처벌을 우려해 막대한 행정적 부담이나 활동 위축(그리고 미국 기술 대기업으로의 쏠림 현상)으로 인해 방해를 받게 될 것입니다.

EU-CRA에 대한 가장 좋은 요약은 Apache Software Foundation의 이 블로그 게시물에서 확인할 수 있습니다.

TLDR;
오픈 소스를 포함한 소프트웨어는 전 세계적으로 규제를 받고 있습니다. 이 긴 블로그 게시물에서는 유럽 연합의 사이버 복원력법(Cyber ​​Resilience Act)의 배경, 좋은 점, 결점, 오픈 소스에 미칠 수 있는 부정적인 영향에 대해 설명합니다.

더 간단하게 정리된 한글 문서를 원하시면 유럽의회 ‘사이버복원력법(CRA)’ 수정안 개요를 읽어보세요.

PHP Core

대부분의 핵심 소식은 PHP 재단의 PHP Core Roundup series에서 자세히 다루고 있으므로 여기서는 몇 가지만 간략하게 언급하겠습니다:

📣RFC: A new JIT implementation based on IR Framework

RFC: IR 프레임워크에 기반한 새로운 JIT 구현

Dmitry Stogov가 별도로 개발된 IR 프레임워크에 기반한 새로운 JIT 구현을 제안합니다.

이 제안이 받아들여지면 일반 PHP 사용자는 성능 향상을 크게 느끼지 못할 수도 있습니다. 현재 상태의 새로운 JIT를 사용하면 PHP-Parser 및 AMPHP와 같이 CPU를 사용하는 애플리케이션의 속도가 약간 향상될 것입니다. 추가 최적화를 통해 속도가 더 빨라지겠지만 극적인 증가는 없을 것입니다.

새 엔진의 가장 큰 장점은 사용이 간편하다는 점입니다. PHP와는 별개의 컴포넌트로 개발되었기 때문에 IR 프로젝트는 PHP 외부에서 활용할 수 있습니다. 이는 잠재적으로 JIT 구현과 관련된 ‘버스 팩터’를 줄이는 데 도움이 될 수 있습니다.

📣RFC: DOM HTML5 parsing and serialization

RFC: DOM HTML5 구문 분석 및 직렬화

Niels Dossche는 DOM 확장에 두 개의 새로운 클래스를 추가할 것을 제안합니다: DOM\HTMLDocumentDOM\XMLDocument입니다.

HTMLDocument 클래스는 사양을 준수하는 HTML5 문서 구문 분석 및 직렬화에 대한 지원을 추가할 것입니다. XMLDocument 클래스는 호환성을 위해 유지되는 \DOMDocument의 최신 대안으로 사용될 것입니다. 이 새로운 클래스는 또한 문서 로딩을 위한 보다 오용을 방지할 수 있는 API를 제공할 것입니다.

전역 네임스페이스에 있는 기존 DOM 클래스는 새 DOM 네임스페이스에서 별칭을 갖게 되므로 새 구현이 기본값이 됩니다.

Who Is Behind PHP by Christoph Rumpel.

PHP의 배후는 누구인가 by Christoph Rumpel.

이 블로그 게시물에서 Christoph는 누가 투표권을 갖는지, Karma란 무엇인지, PHP에 기여자가 되는 방법 등 PHP 개발 프로세스에서 명확하지 않은 모든 종류의 사항을 명확하게 설명합니다.

Tools

  • theodo-group/LLPhant - Langchain과 LLamaIndex에서 영감을 얻은 OpenAI GPT 4를 사용하는 포괄적인 PHP 생성 AI 프레임워크입니다.
    이 프레임워크를 사용하면 한 줄로 함수를 자동으로 정의하고 OpenAI가 응답에서 그렇게 말하면 함수를 실행할 수 있습니다.

    더 많은 예제는 이 블로그 게시물에서 확인할 수 있습니다: https://blog.theodo.com/2023/08/qdrant-llphant-generative-ai-php/. 또한 PHP로 AutoGPT 클론을 만들 수도 있습니다:
  • emreyarligan/enum-concern – 라라벨 컬렉션으로 손쉽게 열거를 처리할 수 있는 패키지입니다.

  • hyperf/hyperf – 초고속과 유연성에 중점을 둔 Swoole 기반 코루틴 프레임워크입니다.

  • loupe-php/loupe – 토큰화, stemming(어간추출), 오타 허용, 필터 및 지역 지원 기능을 갖춘 PHP와 SQLite만을 기반으로 하는 전체 텍스트 검색 엔진입니다.

  • TomasVotruba/lines – 어디서나 실행 가능한 CLI 도구로 PHP 프로젝트의 규모를 빠르게 측정할 수 있습니다.

  • Chemaclass/bashunit – bash 스크립트를 위한 최소한의 테스트 라이브러리입니다.

  • laminas/laminas-text – 멋진 아스키 텍스트 배너를 원하셨나요?

    $figlet = new Laminas\Text\Figlet\Figlet();
    echo $figlet->render('PHP Rocks');
  • espocrm/espocrm – PHP로 구축된 성숙한 오픈소스 CRM입니다.

  • Can I PHP? – 특정 기능을 도입한 PHP 버전을 빠르게 확인할 수 있습니다.

Symfony

Laravel

기타

Fun

  • 디스크 조각 모음기 스타일의 PHPUnit 출력:

  • phpgl/flappyphpant – PHP로 작성되고 PHP-GLFW 및 VISU 프레임워크를 기반으로 하는 간단한 플래피 버드와 유사한 게임입니다. flappyphpant gif

  • A love snippet from Frédéric Bouchery:

    <?php for ($y = 15; $y >= -15; $y--) {
    for ($x = -30; $x < 30; $x++) {
    echo (
    pow(pow($x*0.05, 2)+pow($y*0.1, 2)-1, 3)-
    pow($x*0.05, 2)*pow(($y*0.1), 3) <= 0
    ) ? 'LovePHP!'[($x - $y) % 8]:' ';
    }
    echo "\n";
    }
              P!LovePHP           vePHP!Lov               
    ePHP!LovePHP!Love !LovePHP!LovePHP!
    vePHP!LovePHP!LovePHP!LovePHP!LovePHP!Lov
    vePHP!LovePHP!LovePHP!LovePHP!LovePHP!LoveP
    vePHP!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP
    ePHP!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!
    PHP!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!L
    HP!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!Lo
    P!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!Lov
    !LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!Love
    ovePHP!LovePHP!LovePHP!LovePHP!LovePHP!Love
    ePHP!LovePHP!LovePHP!LovePHP!LovePHP!Love
    PHP!LovePHP!LovePHP!LovePHP!LovePHP!LoveP
    !LovePHP!LovePHP!LovePHP!LovePHP!Love
    ovePHP!LovePHP!LovePHP!LovePHP!Love
    ePHP!LovePHP!LovePHP!LovePHP!Love
    P!LovePHP!LovePHP!LovePHP!Lov
    ovePHP!LovePHP!LovePHP!Lo
    PHP!LovePHP!LovePHP!L
    LovePHP!LovePHP
    PHP!LoveP
    Lov
    v

Conferences

  • Longhorn PHP – Austin, TX, USA, November 2–4, 2023.
  • Laracon AU – Sydney, Australia, November 16–17, 2023.
  • PHPCon Poland – Zawiercie, Poland, November 17–18, 2023.
  • SymfonyCon – Brussels, Belgium, December 7–8, 2023.
  • Laracon EU – Amsterdam, The Netherlands, Feb 5-6, 2024. CFP 🆕
  • PHP UK – London, UK, February 15–16, 2024. CFP
  • PHP[TEK] 2024 – Chicago, IL, USA, April 23–25, 2024. CFP 🆕

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2023년 7월호입니다.


PHP Annotated 7월호에 오신 것을 환영합니다! 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달간 PHP 커뮤니티에서 가장 흥미로운 발전 사항을 요약해드립니다.

Highlights

PHP 8.3.0 beta 1 released

PHP 8.3.0 베타 1 출시

첫 번째 베타 릴리스를 통해 활발한 개발 단계가 종료되었으므로 8.3 브랜치의 새로운 기능 및 변경 사항 목록은 최종 버전으로 간주할 수 있습니다.

Mac을 사용하는 경우 Nuno Maduro의 PHP 8.3 설치 방법을 확인하세요. 이외에는 Docker 이미지가 번거로움 없이 시도해 볼 수 있는 가장 좋은 옵션일 것입니다.

Thomas Jarrand 덕분에 이제 php.net에 모든 PHP 브랜치의 현재 상태를 확인할 수 있는 엔드포인트가 생겼습니다: php.net/releases/states.

elePHPant 디자인의 저자이자 PHP 8 로고의 저자 Vincent Pontier가 PHP 9 로고에 대한 아이디어를 떠올렸습니다:

php9 이미지 아이디어

PHP Version Stats – July, 2023

PHP 버전 통계 - 2023년 7월

클라이언트가 packagist.org로 보내는 데이터(예: 컴포저 업데이트 명령 실행 시)를 기반으로 사용하는 PHP 버전에 대한 정기적인 개요입니다. 68.8%의 클라이언트가 PHP 8.*을 사용하고 있으며, PHP 7.*은 29.7%를 차지합니다. PHP 8은 59.7%였던 작년과 비교하면 느리지만 좋은 성장세입니다.
사용자 세그먼트가 약간 다를 수 있는 Remi 리포지토리 통계에 따르면, 35%의 사용자가 PHP 8.*을, 63%의 사용자가 PHP 7.*을 사용하고 있습니다.

참고로 워드프레스는 다음 워드프레스 6.3 릴리스에서 PHP 5 지원을 중단할 예정입니다. 현재 워드프레스 설치의 5.5%가 여전히 PHP 5를 사용하고 있습니다.

PHP Core

대부분의 코어 소식은 PHP 재단의 PHP Core Roundup 시리즈에서 자세히 다루고 있으므로 여기서는 몇 가지만 간략하게 언급하겠습니다:

❌ RFC: Interface Default Methods

https://wiki.php.net/rfc/interface-default-methods

Levi Morisson의 이 RFC는 많은 논의를 불러일으켰습니다.
Levi는 인터페이스에 메서드에 대한 구현이 있을 수 있다고 제안했는데, 이는 Kotlin, Swift(extend protocols), Java, C# 및 기타 언어에서 가능한 것과 유사합니다.

다중 상속이 잘못되었고 인터페이스에 구현이 있어서는 안 된다고 생각한다면 래리 가필드는 이상한 아이디어를 거부하기 전에 다시 한 번 생각해 볼 것을 제안합니다.

Brent도 What is a Best Practice? 동영상에서 이에 대해 이야기하고 있으며, “Is A” or “Acts As” 게시물에서 더 자세히 설명합니다.

조지가 언급했듯이 일부 사람들은 이 제안이 PHP 8.3의 기능 동결에 너무 근접한 급격한 변화이기 때문에 반대표를 던졌을 수도 있습니다.

✅ RFC: Marking overridden methods (#[\Override])

https://wiki.php.net/rfc/marking_overriden_methods

PHP 8.3에는 #[\Override] 속성이 새로 추가됩니다. 메서드에 적용하면 엔진이 부모 클래스 또는 구현된 인터페이스에 같은 이름의 메서드가 있는지 확인하라는 메시지를 표시합니다.

이는 Java, Kotlin, Swift 및 C#과 같은 다른 언어의 기능과 유사합니다.

✅ RFC: Path to Saner Increment/Decrement operators

https://wiki.php.net/rfc/saner-inc-dec-operators

++-- 연산자의 동작은 PHP 8.3에서 더욱 일관성 있게 변경됩니다.

이 문제를 실제로 보여주고 싶다면 이 예제를 확인해 보세요:

-> PHP 8.2까지 위 문제의 정답은 7입니다.

✅ RFC: PDO driver specific subclasses

https://wiki.php.net/rfc/pdo_driver_specific_subclasses

현재 PHP에는 모든 데이터베이스에 대해 단일 PDO 클래스가 있습니다. 그러나 설치한 실제 DB 드라이버 확장에 따라 이 클래스는 다른 메서드 집합을 가질 수 있습니다.

Dan Ack의 RFC는 지원되는 각 데이터베이스에 대해 별도의 클래스가 있는 특정 서브클래스 집합을 추가할 것을 제안합니다.

✅ PR: Add fallback value syntax for ini variables

https://github.com/php/php-src/pull/11351

가브리엘 폰테스가 PHP 8.3에 깔끔하게 추가한 기능입니다! 환경 변수 외에 php.ini 설정에서 기본값을 사용할 수 있게 됩니다:

xdebug.start_with_request = ${PHP_XDEBUG_START_WITH_REQUEST:-default}

dunglas/php-dev-docker – Docker image to hack the PHP interpreter.

dunglas/php-dev-docker – PHP interpreter를 해킹하기 위한 Docker 이미지.

PHP 버그(segmentation faults)를 추적하고, 확장 기능 또는 PHP 인터프리터 자체를 개발하는 데 편리한 Docker 이미지입니다.

Kévin Dunglas는 PHP 인터프리터를 디버깅하고 개발하기 위해 특별히 Docker 이미지를 준비했습니다. PHP 스크립트로 인해 세그폴트가 발생하나요? PHP 확장을 개발하고 싶으신가요? 이 이미지가 바로 여러분을 위한 것입니다! 필요한 모든 도구가 포함되어 있습니다.

Tools

  • NativePHP – PHP로 데스크톱 애플리케이션 개발
    Marcel Pociot가 만든 이 도구는 일반적인 웹 앱을 구축할 때와 마찬가지로 크로스 플랫폼 데스크톱 앱을 구축할 수 있는 간단한 API와 툴을 제공합니다.
    이 도구는 일렉트론이나 타우리를 사용하므로 이름에 ‘네이티브’라는 단어가 약간 오해의 소지가 있을 수 있습니다. 하지만 PHP 개발자의 관점에서 보면 이 모든 것이 익숙한 도구와 구문으로 멋지게 포장되어 있습니다. Marcel이 이 발표에서 작동 방식을 설명했습니다.

    현재까지는 Laravel에서만 작동하지만, 다른 프레임워크와 네이티브 PHP용 어댑터를 구현할 예정이라고 합니다.

    다음은 NativePHP로 구축된 앱의 예시입니다. 크론 작업을 관리하기 위한 간단한 도구인 simonhamp/cronikl입니다.

  • https://herd.laravel.com/ - 원클릭 PHP 개발 환경.
    Marcel Pociot와 Beyond Code의 또 다른 도구입니다. macOS에서 PHP를 위한 로컬 개발 환경으로, 모든 것이 미리 빌드되어 제공되므로 홈브루나 다른 것을 다룰 필요가 전혀 없습니다.
    저는 마찬가지로 로컬 환경을 제공하지만 더 많은 유연성을 제공하는 IndigoStack의 열렬한 팬입니다.

  • aschmelyun/diode - Laravel을 위한 WASM 기반 로컬 개발 환경과 wp-now에서 영감을 얻은 로컬 개발 환경에 대한 또 다른 접근 방식입니다. 이 비디오는 비하인드 스토리를 제공합니다.

  • yzen-dev/plain-to-class - 이 Hydrator는 데이터를 유형화된 객체로 변환합니다. 상속이 필요하지 않고 프레임워크에 의존하지 않으며 벤치마크에 따르면 가장 효과적인 방법 중 하나입니다.

  • cerbero90/json-parser - 종속성이 없는 구문 분석기로 모든 소스에서 메모리 효율적인 방식으로 대용량 JSON을 읽을 수 있습니다.

  • alexandre-daubois/lazy-stream - 필요할 때만 스트림에 데이터를 쓰고 읽을 수 있습니다.

  • NumPower - 이 PHP용 C 확장 프로그램은 PHP에서 효율적인 과학 컴퓨팅을 위한 기반을 제공하고, 이미 존재하며 이를 활용할 수 있는 머신 러닝 도구와 라이브러리를 활용하기 위해 만들어졌습니다.
    “A library for numerical calculations and scientific computing made for PHP”

Symfony

Laravel

Other frameworks

기타

Fun

Conferences

방문하고 발표를 신청할 만한 다음 PHP 행사를 확인해 보세요:

  • PHPKonf – Istanbul, Turkey, September 2, 2023. CFP 🆕
  • CakeFest – Los Angeles, CA, USA, September 28–Oct 3, 2023.
  • Longhorn PHP – Austin, TX, USA, November 2–4, 2023.
  • PHPCon Poland – Zawiercie, Poland, November 17–18, 2023. CFP 🆕
  • Laracon AU – Sydney, Australia, November 16–17, 2023.
  • SymfonyCon – Brussels, Belgium, December 7–8, 2023. CFP
  • PHP UK – London, UK, February 15–16, 2024. CFP 🆕

다음 PHP 밋업이 언제 열리는지 궁금하다면 Tomas Votruba가 운영하는 멋진 밋업 애그리게이터 friendsofphp.org를 참고하세요. php.net - 이벤트에도 캘린더가 있습니다: 2023년 6월.

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2023년 6월호입니다.


PHP Annotated 6월호에 오신 것을 환영합니다. 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달간 PHP 커뮤니티에서 가장 흥미진진하게 발전한 내용을 요약해 보겠습니다.

Highlights

Happy 28th birthday, PHP!

6월 8일, PHP가 28살이 되었습니다! 과거를 돌아보고 싶으시다면 Rasmus Lerdorf의 PHP 최초 공개 발표를 참조하세요.

앞으로도 개발자에게 힘을 실어주고 웹 기술의 경계를 넓히는 데 기여하기를 바랍니다. 생일 축하합니다, PHP! 🎉🥳🎂

JetBrains PhpStorm 팀은 PHP 커뮤니티 회원 20명에게 가장 좋아하는 코딩 트랙의 이름을 물어보았습니다. 그 결과 PHP로 코딩하는 동안 생산성을 더욱 높일 수 있도록 맞춤화된 재생 목록이 탄생했습니다:
https://open.spotify.com/playlist/02xXEV3NPVzuhgLg4tOpVr

활기차고 다양한 PHP 커뮤니티의 증거인 이 재생 목록에는 아래와 같은 PHP의 거장들이 기여한 콘텐츠가 포함되어 있습니다,
A testament to the vibrant and diverse PHP community, this playlist features contributions from PHP greats such as Christoph Rumpel, Jordi Boggiano, James Titcumb, Matthieu Napoli, Frank de Jonge, Stephen Rees-Carter, Cal Evans, Povilas Korop, Taylor Otwell, Benjamin Eberlei, Nicolas Grekas, Eric Barnes, Ian Landsman, Derick Rethans, Caneco, Zuzana Kunckova, Brent, Tim MacDonald, Mohamed Said, and Paul Redmond.

이 기념일을 기념하기 위해 Brent는 PHP Annotated YouTube channel에서 PhpStorm Elephpant 추첨을 진행했습니다.

Celebrating 20 Years of WordPress

워드프레스 20주년 기념

28살은 아니지만, 충분히 훌륭한 성과입니다! 축하합니다!

PHP 8.3 Alpha 1 available for testing

PHP 8.3 알파 1 테스트 가능

첫 번째 알파 버전이 출시되어 PHP 8.3 릴리즈 프로세스의 시작을 알렸습니다. 업데이트는 정해진 일정에 따라 2주마다 릴리스되며 최종 릴리스는 11월 23일경에 예정되어 있습니다.

7월 18일에 기능 동결이 예정되어 있으므로 일부 변경 사항이 릴리스에 반영되지 않을 수도 있습니다. 현재 가장 주목할 만한 변경 사항은 다음과 같습니다:

모든 변경사항에 대해 자세히 알아보려면 브렌트의 What’s new in PHP 8.3를 참조하세요.

Mac을 사용하는 경우, shivammathur/homebrew-php를 통해 Nightly 채널을 통해 홈브루로 PHP 8.3을 사용해 볼 수 있습니다. 그렇지 않은 경우, 번거로움 없이 사용해 보려면 Docker 이미지가 가장 좋은 옵션일 것입니다.

  • “최신 PHP 버전은 무엇인가요?”
  • “지원되는 최신 버전은 무엇인가요?”
  • “다음 버전은 언제 출시되나요?”
  • “특정 PHP 버전은 언제 지원이 중단되나요?”

이에 대한 모든 답변은 이 PHP 문서 페이지에서 확인할 수 있습니다: https://php.net/supported-versions.php

PHP 8.1.20 and PHP 8.2.7 have been released

PHP 8.1.20PHP 8.2.7이 릴리스되었습니다.

❗ 모든 사용자는 이러한 보안 릴리스로 업데이트할 것을 강력히 권장합니다.

❗️Packagist.org maintainer account takeover

Packagist.org 관리자 계정 탈취
어떤 일이 발생했는지, 영향을 받았는지 알아보세요.

PhpStorm 2023.2 Early Access Program Is Open

PhpStorm 2023.2 미리 체험 프로그램 시작

정식 출시에 앞서 IDE에 추가된 최신 기능을 무료로 미리 사용해 보세요.

PHP가 르네상스를 맞이하고 있나요?

PHP가 “잘 작동한다”는 명성을 되찾고 있습니다. 이 언어는 더 빠르고, 더 안전하며, 더 즐겁게 사용할 수 있도록 진화하고 있습니다.

아직 PHP에 대해 회의적인 친구들과 공유할 수 있는 몇 가지 링크를 소개합니다:

ChatGPT and PHP

Frédéric BoucheryPromises RFCGenerics RFC를 예로 들어 PHP RFC 초안을 쉽게 생성하는 방법을 설명하는 동안, 다음은 PHP에서 LLM을 사용하는 것과 관련된 몇 가지 링크입니다:

PHP Core

대부분의 핵심 소식은 PHP 재단의 PHP Core Roundup series에서 자세히 다루고 있으므로 여기서는 몇 가지만 간략하게 언급하겠습니다:

📣 RFC: Property hooks

이 RFC에서 Ilija Tovillo와 Larry Garfield는 get/set 함수를 사용하여 가상 프로퍼티를 선언할 것을 제안합니다.
디자인과 구문은 Kotlin과 가장 유사하지만 C# 및 Swift의 영향을 받기도 합니다.

class User implements Named
{
private bool $isModified = false;

public function __construct(private string $first, private string $last) {}

public string $fullName {
// Override the "read" action with arbitrary logic.
get => $this->first . " " . $this->last;

// Override the "write" action with arbitrary logic.
set($value) => [$this->first, $this->last] = explode(' ', $value);
}

📣 RFC: Marking overridden methods (#[\Override])

Tim Düsterhus는 새로운 #[\Override] 어트리뷰트를 도입할 것을 제안합니다. 이 속성을 메서드에 적용하면 엔진이 부모 클래스 또는 구현된 인터페이스에 같은 이름의 메서드가 있는지 확인하라는 메시지를 표시합니다.

interface I {    public function i(): void;
}

class P {
#[\Override]
public function i(): void {} // Fatal error: P::i() has #[\Override] attribute, but no matching parent method exists
}

class C extends P implements I {} // All good 👍

📣RFC: NameOf

Robert Landers는 글로벌 nameof() 함수를 추가할 것을 제안합니다. 이 함수를 사용하면 개발자가 거의 모든 사용자 정의 변수, property, 상수 또는 멤버의 이름을 빠르고 쉽게 검색할 수 있습니다.

echo nameof($variable); // variable 
echo nameof($object->property); // property
echo nameof(Enum::Case); // Case
echo nameof(Object::Const); // Const
echo nameof(myFunction(...)); // myFunction
echo nameof(MY_CONSTANT); // MY_CONSTANT

Tools

  • wp-now - 워드프레스 엔지니어링 팀의 로컬 개발 환경.
    이 도구는 웹어셈블리를 활용하여 Node.js의 웹서버 위에서 PHP를 작동합니다. 도커 기반 환경보다 빠르며 모든 PHP 앱에서 사용할 수 있지만 DB를 실행하는 방법을 찾아야 합니다.
  • PHP Monitor 6.0 출시 - 이번 주요 업데이트에서는 새로운 PHP 버전 관리자, Valet을 설치하지 않고도 앱이 작동할 수 있는 새로운 독립형 모드 등이 도입되었습니다.
  • pmjones/AutoShel - CLI 명령 이름을 지정된 네임스페이스의 PHP 명령 클래스에 자동으로 매핑하여 해당 클래스 내의 지정된 메인 메서드에 반영하여 인수 및 옵션 값을 결정합니다. 메서드 매개변수는 스칼라 값(int, float, string, bool) 또는 배열일 수 있습니다.
  • jolicode/castor - 개발자 경험에 중점을 두고 설계된 작업 실행기 및 명령 런처로, PHP를 사용하여 구축되었습니다.
  • ProjektGopher/whisky - 팀 전체에서 PHP 프로젝트의 git hook을 관리하고 적용하기 위한 간단하고 프레임워크에 구애받지 않는 CLI 도구입니다.
  • schranz-search/schranz-search - PHP로 작성된 다양한 검색 엔진에 대한 검색 추상화. 현재 구현된 엔진으로는 Elasticsearch, Opensearch, Algolia, Meilisearch, RediSearch, Solr, Typesense 등이 있습니다.
  • TestGenAI - Rector의 저자 Tomas Votruba가 만든 PHP 코드에 대한 단위 테스트를 생성하는 도구입니다.
  • librarianphp/librarian - 휴고와 DEV에서 영감을 받아 PHP로 작성된 정적 사이트 생성기 및 마크다운 인덱서입니다. 개발 비하인드 스토리를 읽어보세요.

Symfony

Laravel

Other frameworks

기타

Conferences

오프라인 이벤트가 한창 진행 중입니다. 방문하고 발표를 신청할 만한 예정된 PHP 공연을 확인해 보세요:

  • Laracon US – Nashville, TN, USA, July 19–20, 2023.
  • CakeFest – Los Angeles, CA, USA, Sep 28–Oct 3, 2023.
  • Longhorn PHP – Austin, TX, USA, November 2-4, 2023.
  • SymfonyCon – Brussels, Belgium, December 7–8, 2023.

다음 PHP 밋업이 언제 열리는지 궁금하다면 Tomas Votruba의 멋진 밋업 애그리게이터 friendsofphp.org에서 확인할 수 있습니다. php.net - 이벤트에도 캘린더가 있습니다: 2023년 6월.

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2023년 4월의 번역/해석본입니다.


For convenience, sequences may also be applied using the sequence method, which simply invokes the state method internally. The sequence method accepts a closure or arrays of sequenced attributes:
번역:

여러분 안녕하세요!

엄선된 뉴스, 기사, 도구, 동영상 등 지난 한 달간 PHP 세계에서 일어난 가장 흥미로운 일들을 살펴보는 PHP Annotated 4월호에 오신 것을 환영합니다.

News

PHP 8.1.18 and PHP 8.2.5 released.

PHP 8.1.18PHP 8.2.5가 릴리스 되었습니다.

🐛 버그 수정 릴리스입니다.

Pest 2.0 released

Pest 2.0 출시.

Pest v2는 테스트 재시도, 느린 테스트 프로파일링, 새로운 arch 플러그인 지원 등 많은 새로운 기능을 제공합니다.

Bref 2.0 released

Bref 2.0 출시

Bref를 사용하면 AWS Lambda 서버리스 플랫폼에 PHP 앱을 쉽게 배포할 수 있습니다.

이번 주요 업데이트에서는 PHP 설정을 위한 더 간단한 구성, 개선된 Laravel 통합, 더 빠른 배포, 런타임 시 환경 변수의 시크릿 자동 로드, 로컬 개발을 위한 더 간소화된 docker-compose.yml이 제공됩니다.

서버리스 PHP 뉴스레터를 구독하여 해당 주제에 대한 더 많은 콘텐츠를 확인하세요.

PER Coding Style 2.0 released

PER 코딩 스타일 2.0 출시

새 버전의 PHP 코딩 스타일 가이드라인은 몇 가지 문제를 수정하고 최근 추가된 PHP 구문에 대한 가이드를 업데이트합니다.

PER CS 2.0이 PSR-12와 어떻게 다른지 확인하려면 여기를 클릭하세요.

PhpStorm 2023.1 released

PhpStorm 2023.1 출시

이번 업데이트는 올해 PhpStorm의 첫 번째 주요 업데이트입니다. 3v4l.org와의 통합, 향상된 성능, 새로운 UI 개선 사항, PHP용 DFA 디버거 등 다양한 기능이 제공됩니다.

PHP Foundation Update, March 2023

PHP 재단 업데이트, 2023년 3월

PHP 재단 팀은 GitHub 스폰서를 통한 PHP 지원 가능성을 발표하고 새로운 자문위원회 이니셔티브를 공개했습니다.

PHP 8.3 release managers announced

PHP 8.3 릴리즈 매니저 발표

전통에 따라 PHP 8.3에는 두 명의 신인 릴리즈 매니저가 있습니다: PHP 재단이 후원하는 PHP 핵심 개발자 Jakub ZelenkaEric Mann입니다. 이들은 베테랑 RM Pierrick Charron의 도움을 받게 됩니다.

PHP Core

대부분의 핵심 소식은 PHP 재단에서 제공하는 PHP 코어 라운드업 시리즈에서 자세히 다루고 있으므로 몇 가지 주요 내용만 나열하겠습니다:

✅ RFC: Arbitrary static variable initializers

RFC: 임의의 정적 변수 이니셜라이저

PHP는 모든 함수 내에서 정적 변수를 선언할 수 있습니다. 정적 변수의 값은 함수 호출보다 오래 지속되며 향후 함수 실행 시에도 공유됩니다.

PHP 8.3에서는 다른 함수의 결과와 같은 모든 표현식을 할당할 수 있습니다.

function bar() {    
echo "bar() called\n";
return 1;
}

function foo() {
static $i = bar(); // This currently produces a fatal error, but will work in PHP 8.3
echo $i++, "\n";
}

foo();
// bar() called
// 1
foo();
// 2
foo();
// 3

부작용으로, PHP 8.3에서는 정적 변수를 다시 선언하는 것이 금지됩니다. 이렇게 하면 아마도 실제 코드에서 볼 수 없었을 PHP의 몇 가지 단점이 수정됩니다:

<?php
function f()
{
static $x = 1;

return $x;

static $x = 2;
}
echo f();

두 번째 정적 선언에 연결할 수 없을 것이라고 예상했다면 안타깝게도 착각입니다:
PHP 8.3 이전 버전에서의 결과: https://3v4l.org/HhpYj

Output for 8.0.1 - 8.0.28, 8.1.0 - 8.1.18, 8.2.0 - 8.2.5
2

📣 RFC: Clone with

RFC: Clone with

Máté Kocsis는 클론 연산자를 확장하여 “clone with”라는 새로운 언어 구조에 대한 지원을 추가하여 더 적은 코드로 모든 종류의 인스턴스 속성(declared/dynamic, typed/untyped, readonly/non-readonly)에 대한 “wither” 메서드를 작성할 수 있도록 할 것을 제안했습니다.

example:

class Response implements ResponseInterface {    
public readonly int $statusCode;
public readonly string $reasonPhrase;
// ...
public function withStatus($code, $reasonPhrase = ''): Response
{
return clone $this with {
statusCode: $code,
reasonPhrase: $reasonPhrase
};
}
// ...
}

$response = new Response(200);
$response->withStatus(201)->withStatus(202);

📣 RFC: New core autoloading mechanism with support for function autoloading

RFC: 새로운 코어 자동 로딩 메커니즘과 함수 자동 로딩 지원

George Peter Banyard와 Dan Ackroyd는 더 나은 설계의 클래스 자동 로딩 메커니즘과 새로운 함수 자동 로딩 메커니즘을 제안합니다.

📣 Jakub Zelenka proposes to form PHP Technical Committee

Jakub Zelenka는 PHP 기술 위원회를 구성하는 것을 제안합니다.

PHP는 RFC 투표를 사용하여 사용자가 볼 수 있는 언어 변경을 결정하는데, 이는 몇 가지 알려진 문제에도 불구하고 잘 작동합니다. 그러나 PHP 내부 및 확장 API에 영향을 미치는 기술적 변경에는 효과적이지 않으며, 기술적 기반에 대한 기여자 간의 갈등이 쉽게 해결되지 않습니다.
제안된 위원회는 선출된 5명의 위원으로 구성되며, 변경에 대한 분쟁이나 질문이 발생할 경우 위원회에 해결을 요청할 수 있습니다.

Tools

  • crazywhalecc/static-php-cli - PHP 앱을 추가 의존성 없이 단일 바이너리 파일로 빌드하는 도구입니다.

  • aschmelyun/subvert - 비디오에서 초 단위로 자막, 요약 및 챕터를 생성합니다.

  • yiisoft/db - 다양한 유형의 데이터베이스(MariaDB, MSSQL, MySQL, Oracle, PostgreSQL, SQLite)에 대한 프레임워크에 구애받지 않은 쿼리 빌더입니다.

  • Crell/EnvMapper - 정의된 클래스 객체에 환경 변수를 쉽게 매핑하여 의존성 주입을 위해 준비합니다.

  • PHP Skeleton for Bison by Anton Sukhachev.
    PHP와 많은 다른 언어의 구문은 Bison 형식의 문법으로 설명됩니다. mrsuh/php-bison-skeleton을 사용하면 third-party 의존없이 PHP에서 Bison 파서를 생성할 수 있습니다.

  • 🚧 NativePHP
    Marcel Pociot는 Electron 또는 Tauri 위에 Laravel/PHP 앱을 데스크톱에서 실행하는 도구를 개발하고 있습니다.

Symfony

Laravel

  • Laravel Valet 4.0 released
    이름과 달리 Laravel Valet은 모든 PHP 프로젝트에 사용할 수 있는 최소한의 macOS용 개발 환경입니다.

    이번 릴리즈는 대부분 내부를 다시 작성하는 데 중점을 두었기 때문에 디버그, 수정 및 수정이 더 쉬워졌습니다. 또한 새로운 valet status 명령이 추가되었으며 공유 옵션으로 Expose 기능을 지원합니다.

  • Laravel IDEA 7.0
    인기있는 플러그인 PhpStorm에 대한 주요 업데이트가 있었습니다. “새로운 Eloquent 모델” UI와 Twig 템플릿 지원이 포함되어 있습니다. Laravel Daily에서 이 비디오 데모를 확인하십시오.

  • Marcel Pociot의 새로운 OpenAI Chat API를 사용하여 ChatGPT 클론을 만드는 방법.

  • Christoph Rumpel의 Laravel 애플리케이션에서 테스트할 수 있는 모든 것.
    실제 응용 프로그램에서 테스트해야 할 시나리오의 예제가 포함된 훌륭한 가이드입니다.

  • TomasVotruba/bladestan – Blade 템플릿을 위한 PHPStan 분석.

  • lunarphp/lunar – 오픈 소스 헤드리스 e-커머스 패키지로 Laravel에 사용할 수 있습니다. 자체 스토어 프런트를 만들 수 있지만 백엔드 작업은 이미 완성되어 있었습니다.

  • area17/twill - 직관적이고 강력하며 유연한 사용자 지정 관리 콘솔을 빠르게 생성하는 데 도움이 되는 Laravel용 CMS 툴킷입니다.

  • 📺 Laravel Weekly Update #6 – 이제 팀에서 매주 라라벨 뉴스와 업데이트를 짧은 동영상으로 정리하여 제공합니다.

기타

  • Announcing WCGI: WebAssembly + CGI – Wasmer의 사람들이 기존 CGI 애플리케이션을 WASI로 컴파일하여 재사용할 수 있는 새로운 기술을 발표합니다. 이를 통해 비즈니스 로직과 정적 asset만 포함하고 HTTP 스택이나 부피가 큰 Docker 컨테이너가 없는 초소형 패키지를 출시할 수 있습니다.

  • PHP에서 한 줄 코드를 피하기 by Andreas Möller. 코드를 이해하고 디버깅하기 쉽게 만들어 줍니다.
    break point를 정확히 원하는 곳에 사용해 디버깅할 수 있고, 코드 커버리지를 정확히 측정하면서, 가독성을 높일 수 있다고 주장합니다.

  • Secure Your PHP Code With Taint Analysis by Qodana by Valerie Kuzmina.
    JetBrains의 코드 품질 플랫폼인 Qodana의 손상 분석(Taint Analysis)으로 PHP 코드 보호
    오염의 예

    • 오염의 예. GET 매개변수의 임의 데이터가 화면에 표시됩니다. 예를 들어 악의적인 사용자는 이 취약점을 악용하여 프로그램 레이아웃을 변경할 수 있습니다.
      PhpStorm에서 issue 열기
  • Discovering PHP’s first-class callable syntax by Freek Van der Herten.
    PHP의 first-class callable 구문 알아보기

  • Blazingly Fast Markdown Parsing in PHP using FFI and Rust by Ryan Chandler.
    PHP의 FFI와 Rust를 사용한 놀랍도록 빠른 마크다운 파싱

  • Cloning readonly properties in PHP 8.3 by Brent Roose.
    PHP 8.3에서 읽기 전용 프로퍼티 복제하기

  • Using PSR-3 placeholders properly by Larry Garfield.
    PSR-3 플레이스홀더 올바르게 사용하기

  • Extending PHP 8.1 enums with attributes by Rob Fonseca.
    Attribute로 PHP 8.1 열거형(enum) 확장하기. 간단하지만 깔끔한 어트리뷰트 사용법.

Community

  • 여러분이 놓쳤을 수도 있는데, Brent와 Roman이 이제 PHP Annotated의 비디오 버전을 제작하고 있습니다. 최신 소식을 확인하고 PHP Annotated YouTube 채널 구독도 잊지 마세요.

  • PoPHPularity: Is it decreasing and what to do about it? by Christian Olear.
    PoPHPularity: PHP의 인기는 줄어들고 있고, 이에 대해 어떻게 대처해야 할까?

  • Modern PHP by Dimitrios Lytras
    “내가 신경을 쓰지 않은 동안, PHP가 꽤 좋아졌다.”

    • Array destructuring (v7.1)
    • Spread operator within arrays (v7.4) & (v8.1)
    • Match expressions (v8.0)
    • Enumerations (enums) (v8.1)
    • Arrow functions (v7.4)
    • Named parameters (v8.0)
    • Null coalescing operator (v7.0)
    • Null coalescing assignment operator (v7.4)
    • Null-safe operator (v8.0)
    • Spaceship operator (v7.0)
    • Multi catch exception handling (v7.1)
    • str_starts_with, str_ends_with, str_contains (v8.0)
    • Return Types (v7.0)
    • Union types (v8.0)
    • Null and Void return types (v7.1)
    • Never return type (v8.1)
    • Grouped imports (v7.0)
    • Constructor property promotion (v8.0)
    • WeakMaps (v8.0)
  • “그 차는 PHP 전도사 역할을 톡톡히 해왔습니다.”

Conferences

참가하고 신청할 가치가 있는 다가오는 PHP 모임을 확인하십시오.

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2023년 2월의 번역/해석본입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


안녕하세요, 여러분!

PHP Annotated 2월호에 오신 것을 환영합니다. 엄선된 뉴스, 기사, 도구, 동영상 등 지난 한 달간 PHP 세계에서 일어난 가장 흥미로운 일들을 소개합니다.

News

PHP 8.0.28, PHP 8.1.16, and PHP 8.2.3 have been released.

PHP 8.0.28, PHP 8.1.16PHP 8.2.3이 릴리스되었습니다.

❗️ 이들은 CVE-2023-0568, CVE-2023-0567, CVE-2023-0662 에 대한 수정이 포함된 보안 업데이트입니다.

당분간은 여전히 PHP 7.4를 사용하는 경우 Remi의 리포지토리에 백포트된 보안 수정 사항이 포함된 업데이트가 있습니다. 그러나 이 리포지토리는 Remi가 얼마나 많은 여유 시간을 제공할 수 있는지에 따라 달라지는 최선의 노력 프로젝트임을 명심하세요. 즉, 사용자에게 마이그레이션할 시간을 더 주기 위한 것이므로 향후 업데이트에 대한 보장은 없습니다.

Laravel v10 has been released

Laravel v10이 출시되었습니다.

다음은 이 업데이트에 대해 자세히 알아보는 데 도움이 되는 몇 가지 리소스입니다:

팀에서 발표한 주요 변경 사항 중 하나는 전체 Laravel 패키지 세트에 유형 선언을 추가한 것입니다.
이로 인해 컨트롤러 스텁(stub)에서 사용자에게 문제가 발생했습니다. 그리고 얼마 후 Laravel 팀은 유형 선언을 모두 제거하기로 결정했습니다.

Martin Joo(@mmartin_joo)의 트윗

All the drama about the Controller return types🚀🎉😀

트윗 이미지

Taylor Otwell(@taylorotwell)의 트윗

컨트롤러 스텁에서 반환 유형을 제거하기로 결정했습니다. 👍
원한다면 추가하세요. ✅

PHPUnit 10 is out

PHPUnit 10이 출시되었습니다.

2년간의 개발 끝에 Sebastian Bergmann과 PHPUnit 팀이 이 major 릴리스를 발표했습니다.

이번 릴리즈는 PHP 7이 PHPUnit에 그랬던 것처럼 대규모 정리, 리팩토링, 현대화를 통해 향후 개발의 토대를 마련한 것입니다.

Attribute, 정적 데이터 공급자(static data providers), 더 적은 오류 알림(notice), 더 간소화된 이벤트 시스템을 제공합니다.

  • PHPUnit 10은 E_USER_NOTICE를 예외로 변환하지 않으므로 테스트 실행이 중단되지 않습니다

PHP Release Radar 채널에 게시된 PHPUnit 개발자와의 인터뷰를 확인해 보세요: PHP Release Radar – Episode 14: PHPUnit 10.0.

이번 릴리즈의 내부 변경 사항 중 하나는 새로운 이벤트 시스템으로, PHPUnit extension 개발자에게 영향을 줍니다. 새로운 이벤트 시스템으로 PHPUnit 확장하기 게시물에서 자세히 알아보세요.

A big release for the PER coding style is coming.

PER 코딩 스타일에 대한 대규모 릴리스가 곧 출시됩니다.

PER 코딩 스타일은 코드를 더 읽기 쉽게 만들고 “여기에 공백을 추가해야 할까요?” 또는 “이 문장은 별도의 줄에 넣어야 할까요?”와 같은 질문을 끝내고 정말 중요한 일에 시간을 할애할 수 있도록 하는 것을 목표로 하며, PER은 롤링 문서이므로 팀이 여러 PSR을 만드는 대신 여러 버전에 태그를 지정하게 됩니다.

버전 1.0.0은 PSR-12의 복사본이었습니다. 다음 버전은 최신 PHP 기능을 포함하도록 사양을 업데이트하고 문제를 수정하는 데 중점을 둘 것입니다.

GitHub 이슈 탭(https://github.com/php-fig/per-coding-style)에 피드백을 남길 수 있습니다.


PHP Core

대부분의 핵심 소식은 PHP 재단에서 제공하는 PHP Core Roundup 시리즈에서 자세히 다루고 있으므로 여기서는 간략하게만 언급하겠습니다:

❌ RFC: Asymmetric Visibility

RFC: 비대칭 가시성

Ilija Tovilo와 Larry Garfield는 필요한 피드백을 받아 이 RFC의 수정 버전을 발표할 예정이지만, 지금은 프로퍼티에 대한 후크와 접근자를 추가하는 제안에 집중할 것입니다.

✅ RFC: Readonly amendments #PHP 8.3

RFC: Readonly 수정 사항 #PHP 8.3

class Foo {    
public function __construct(
public readonly DateTime $bar,
) {}

public function __clone()
{
$this->bar = clone $this->bar; // This produces a Fatal error in PHP <8.2
// and will work in PHP 8.3+
}
}

$foo = new Foo(new DateTime());
$foo2 = clone $foo;

📣 RFC: Path to Saner Increment/Decrement operators #PHP 8.3

RFC: 더 건전한 증분/감소 연산자로 가는 길 #PHP 8.3

George Peter Banyard는 ++-- 연산자의 동작을 일관되게 만들 것을 제안합니다.

📣 RFC: Pass Scope to Magic Accessors #PHP 8.3

RFC: 매직 접근자에 범위 전달 #PHP 8.3

Nicolas Grekas와 Ilija Tovilo가 호출 범위를 매직 접근자에게 전달하는 것을 제안했습니다.

논의 과정에서 커뮤니티 회원들은 범위를 올바르게 반환하는 별도의 함수를 추가할 것을 제안했고, RFC 작성자는 이 아이디어로 방향을 전환할 수 있습니다.

📊 RFC: Typed class constants #PHP 8.3

RFC: 타입 클래스 상수 #PHP 8.3

Benas Seliuginas와 Máté Kocsis는 클래스 및 인터페이스의 콘텐츠에 대한 타입 선언을 허용할 것을 제안합니다.
다음은 이 문제와 타입 상수가 어떻게 도움이 되는지 보여주는 몇 가지 예제 코드입니다:

interface I {
const TEST = "Test"; // We may naively assume that I::TEST is a string.
}

class Foo implements I {
const TEST = []; // But it may be an array...
}

class Bar extends Foo {
const TEST = null; // Or null
}

📣 RFC: Working With Substrings #PHP 8.3

RFC: 서브스트링으로 작업하기 #PHP 8.3

Thomas Hruska는 PHP에 꽤 많은 삶의 질 개선 기능을 구현했으며, 이 RFC는 서브스트링 처리를 최적화하기 위해 그 중 일부를 코어로 가져온 최초의 RFC입니다.


PhpStorm

PhpStorm 2023.1 Early Access Program Is Open

PhpStorm 2023.1 Early Access 프로그램 시작

곧 출시될 주요 릴리스에서 다음과 같은 새로운 기능을 이미 사용해 볼 수 있습니다:

  • 3v4l.org에서 PHP 스크립트 실행 가능.
  • 인기 있는 PHP 패키지의 공유 인덱스를 포함한 성능 개선.
    • PhpStorm에서 로컬로 구축되는 일반 인덱스와 달리 공유 인덱스는 한 번 생성되고 나중에 필요할 때마다 다른 컴퓨터에서 재사용됩니다.
  • 새로운 UI에 대한 많은 개선.
  • 사용자 정의 정규식 기반 검색 및 바꾸기 검사.

Command Line Launcher

명령줄 실행기 plugin

터미널 명령을 실행하고 관리하는 데 도움이 되는 PhpStorm 플러그인입니다. 이 플러그인을 사용하여 서버, Docker를 시작하거나 원격 서버에서 명령을 실행할 수도 있습니다.

Command Line Launcher plugin 스크린샷


Tools


Symfony


Laravel


Other Frameworks

  • Yii news 2023, issue 1 by Wilmer Arambula.
  • Spiral/framework v3.6.0 – 이미 알고 계실지도 모르지만, 이 인상적인 프레임워크를 개발한 팀도 RoadRunner입니다. 최신 릴리스에서는 fiber를 지원하는 컨테이너에서 격리된 메모리 범위라는 PHP 프레임워크를 위한 고유한 기능을 만들었습니다. 이는 장기 실행(데몬) PHP 애플리케이션의 메모리 누수를 제한하는 데 도움이 됩니다.
    프레임워크의 또 다른 흥미로운 아이디어는 CLI 명령을 사용하여 PHP attribute를 만드는 것입니다.

기타

How to extend lifetime of legacy PHP applications by Ayesh Karunaratne (PHP.Watch).

레거시 PHP 애플리케이션의 수명을 연장하는 방법.

Hakana: Taking Hack Seriously by Matt Brown from Slack, and author of Psalm.

Hakana: Hack을 진지하게 받아들이기

Slack의 Matt Brown과 Psalm의 저자 Matt는 Hakana라는 새로운 Hack용 정적 분석기를 발표했습니다. 이 분석기는 Psalm을 기반으로 하며 Rust로 작성되었습니다.

Hakana는 Psalm보다 훨씬 빠르지만 PHP와 호환되지 않습니다. 하지만 Matt는 호환이 가능할 것이라고 언급했습니다:

쉽지는 않겠지만, PHP 코드베이스가 매우 큰 회사라면 Hakana를 포크하여 PHP 코드를 분석할 수 있도록 변경하는 것을 고려할 수 있습니다.

Good Bye, Monorepo by Tomas Votruba.

안녕, 모노레포.

Documenting the system under test in PHPUnit by Andreas Möller.

테스트 대상 시스템(system under test)을 PHPUnit으로 문서화하기.

PHP Development Server <= 7.4.21 – Remote Source Disclosure – A vulnerability analysis.

PHP 개발 서버 <= 7.4.21 - 원격 서버의 소스 코드 누출 - 취약점 분석.

PHP wishlist:

PHPLift – Compatibility Guide

PHPLift - 호환성 가이드

Anna Filina(@afilina)의 트윗

제가 한동안 작업해 온 프로젝트를 발표합니다: PHPLift입니다.

앱의 PHP 버전을 업그레이드하는 데 도움이 되는 가이드입니다. 현재 진행 중인 작업이므로 정기적으로 콘텐츠를 추가할 예정입니다. 누군가에게 도움이 되길 바랍니다. 즐거운 업그레이드 되세요!

https://phplift.com

azjezz/typed

azjezz/typed

Sergii Shymko(@SergiiShymko)의 트윗

와우! PHP에서 로컬 변수를 강력하게 입력할 수 있습니다! 이 변수는 아래에 생성된 익명 클래스의 유형화된 속성을 참조합니다.
https://3v4l.org/T6GFS

심지어 모든 기본 유형에 대한 선언이 포함된 Composer 패키지도 있습니다.

<?php
declare(strict_types=1);

function &declare_int(int $value) {
static $references = [];

$valueWrapper = new class(value) {
public function __construct(public int $value) {
}
};
$references[] = $valueWrapper;

return $valueWrapper->value;
}

$intVariable = &declare_int(0);

$intVariable = 42; // works
$intVariable = 'test'; // fails

Video


Conferences

오프라인 이벤트가 한창 진행 중입니다. 방문하고 발표를 신청해 볼 만한 대형 PHP 행사를 확인해 보세요:

다음 PHP 밋업이 언제인지 궁금하다면 Tomas Votruba의 멋진 밋업 애그리게이터 friendsofphp.org에서 확인할 수 있습니다. php.net 이벤트에도 캘린더가 있습니다: 2023년 3월.

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2023년 1월의 번역/해석본입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


안녕하세요 여러분!

선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일을 따라잡을 PHP Annotated 1월 기사에 오신 것을 환영합니다.

News

PHP 8.0.27, PHP 8.1.14, PHP 8.2.1 have been released

PHP 8.0.27, PHP 8.1.14, PHP 8.2.1이 릴리스되었습니다
. ⚠️️ 이들은 보안 수정 릴리스입니다.

What’s Next in PhpStorm: The 2023.1 Public Roadmap

PhpStorm의 새로운 기능: 2023.1 공개 로드맵

2023년 첫 번째 릴리스에서는 성능을 개선하고 더 빠른 인덱싱을 제공하고, 3v4l 통합을 추가하고, 제네릭에 대한 지원을 개선하고, PHPStan 및 Psalm 태그를 추가하고, multi-composer와 multi-vendor project에 대한 지원을 추가하는 것을 목표로 합니다.

PHP as WebAssembly and WASI modules

WebAssembly 및 WASI 모듈로서의 PHP.

VMware OCTO WasmLabs의 사람들은 WASI를 사용하여 PHP를 WebAssembly로 포팅하는 작업을 하고 있습니다. 이 개념은 새로운 것이 아니며 오래 전에 emscripten을 사용하여 PHP를 WebAssembly로 컴파일할 수 있었습니다.

그러나 이제 GitHub에 바로 사용할 수 있는 컴파일된 PHP Wasm 모듈(PHP 8.1, PHP 8.2)이 있기 때문에 훨씬 더 쉬워졌습니다.

다음은 몇 가지 흥미로운 사용 사례입니다.

그건 그렇고, WebAssembly로 구동되어 브라우저에서 실행되는 WP인 WordPress 놀이터를 확인하십시오.

VMware의 사람들은 PHP용 패치를 준비 했으며 WebAssembly가 애플리케이션 보안 및 배포(delivery)와 관련하여 제공하는 이점을 PythonRuby와 유사하게 PHP로 가져오는 데 매우 관심이 있다고 말했습니다.

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Core Roundup 시리즈에서 자세히 다루므로 간단히 언급하겠습니다.

✅ RFC: Dynamic class constant fetch

RFC: 동적 클래스 상수 가져오기.

PHP 8.3은 클래스 상수를 조회하기 위한 구문을 도입합니다.

class Foo {
const BAR = 'bar';
}
$bar = 'BAR';

// New syntax in PHP 8.3:
echo Foo::{$bar};

✅ RFC: More Appropriate Date/Time Exceptions

RFC: 더 적절한 날짜/시간 예외

PHP 8.3부터 날짜/시간 클래스를 사용할 때 무언가 잘못되면 PHP는 더 구체적인 예외를 발생시킵니다.
날짜/시간 함수의 절차적 스타일은 영향을 받지 않으며 현재와 같이 경고 및 오류를 계속 사용합니다.

📊 RFC: Asymmetric Visibility

RFC: 비대칭 가시성

Ilija Tovilo와 Larry Garfield는 속성이 읽기 및 쓰기 작업에 대해 별도(“비대칭”)의 가시성을 가질 수 있도록 Swift와 유사한 구문을 추가할 것을 제안했습니다.

class Foo {
public private(set) string $bar;
}

현재 투표가 느리게 진행되고 있으며 기능이 2/3 임계값에 도달할 만큼 충분한 투표를 받지 못하고 있습니다.

RFC: SameSite 쿠키 속성 매개변수 추가 #PHP 8.3

George Peter Banyard는 모든 SameSite 관련 함수에 SameSite 매개변수를 추가할 것을 제안합니다.

SameSite 쿠키 속성에 대한 지원이 PHP 7.3에 추가되었습니다. (Same Site Cookie RFC)

그러나 선택한 값에 “samesite” 키가 정의된 옵션 배열을 전달해야만 설정할 수 있으며 이는 다른 모든 특성과 대조됩니다.

당시 RFC에서 SameSite 매개변수를 추가하자는 제안은 만장일치로 거절되었는데, 매개변수 추가에 반대하는 주요 주장 중 하나는 함수에 이미 6개의 선택적 매개변수가 있고 SameSite 특성을 설정하려면 다른 모든 선택적 매개변수를 제공해야 한다는 것입니다.

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false [, string $samesite = "" ]]]]]]] )
  • 당시 거절된 스타일

그러나 PHP 8.0에 명명된 인수가 도입되면서 더 이상 문제가 되지 않습니다.

이 RFC에서는 SameSite enum을 추가하고

enum SameSite {
case None;
case Lax;
case Strict;
}

SameSite $sameSite = SameSite::Lax parameter를 setcookie(), setrawcookie(), session_set_cookie_params()에 추가합니다.

A set of 18 functions/changes to improve PHP core

PHP 코어를 개선하기 위한 18가지 기능/변경 세트.

Thomas Hruska는 PHP 코어용으로 설계된 삶의 질 개선 기능 세트인 cubiclesoft/php-ext-qolfuncs를 구현했습니다.
이 세트에는 꽤 깔끔한 추가 기능이 있습니다. 몇가지를 언급하자면 str_splice(), str_realloc(), fread_mem(), is_reference(), refcount(). 공식적인 RFC로 볼 수 있기를 희망합니다.

Tools

amphp/amp 3.0.0

amphp/amp 3.0.0 – PHP 애플리케이션용 non-blocking 동시성 프레임워크가 major 업데이트 했습니다. 이제 Generators 대신 Fiber를 사용하는 코루틴을 기반으로 하며 revoltphp/event-loop를 사용합니다.

수많은 Amphp 생태계 패키지도 업데이트되었습니다. 다음은 몇 가지 예입니다: amphp/pipelineamphp/process.

PHP-DI 7.0

PHP-DI 7.0 – 이 종속성 주입 컨테이너 패키지에 대한 이 업데이트는 PHP 8.0+ 지원, #[Inject] attribute로 대체된 @Inject PHPDoc 주석, PSR-11 2.0 호환성 및 기타 개선 사항과 함께 제공됩니다.

php-ffi/var-dumper

php-ffi/var-dumper – 함수 dd()및 dump()로 FFI type을 dump할 수 있게 해주는 symfony/var-dumper의 래퍼.

olvlvl/composer-attribute-collector

olvlvl/composer-attribute-collector – PHP 8 속성 대상을 검색하는 편리하고 비용이 거의 들지 않는 방법입니다.

PHPCSStandards/PHPCSExtra

PHPCSStandards/PHPCSExtra – PHP_CodeSniffer와 함께 사용하기 위한 추가 규칙 모음입니다.

cerbero90/enum

cerbero90/enum – enum 기능을 강화하는 PHP 패키지입니다. 기본적으로 열거형에 추가하여 수많은 유용한 기능을 제공할 수 있는 특성입니다.

NoiseByNorthwest/php-spx

NoiseByNorthwest/php-spx – 웹 UI가 내장된 간단하고 직관적인 PHP 프로파일링 확장 프로그램입니다.

PXP

PXP – 확장된 구문 및 런타임 기능을 갖춘 PHP의 상위 집합(superset) 언어입니다.

Ryan ChandlerRust로 PHP 파서를 개발하면서 시작했습니다. 이 프로젝트는 상위 집합(superset) 언어에 대한 전체 아이디어로 성장했습니다.

이전에 PHP용 상위 집합(marcioAlmada/yay 또는 nunomaduro/plus-1)을 구축하려는 몇 가지 시도가 있었지만 이번 시도는 매우 유망해 보입니다.

외관상으로는 Rust에서 개발된 또 다른 유사한 시도가 있습니다:
Ara 프로그래밍 언어 – PHP로 직접 컴파일되는, 정적으로 타입이 지정되는(Statically Typed) 프로그래밍 언어입니다.

Symfony

POC of Clean Architecture with Symfony by Stefano Alletti.

Stefano Alletti의 Symfony를 사용한 Clean Architecture의 POC.

How To Build Activity Log Using Doctrine Events by Jarosław Szutkowski.

Jarosław Szutkowski의 Doctrine Event를 사용하여 활동 기록을 작성하는 방법.

Replacing manual API endpoints with API Platform 3 in a Symfony application by Loïc Vernet.

Loïc Vernet의 Symfony 애플리케이션에서 수동 API 엔드포인트를 API 플랫폼 3으로 대체합니다.

Laravel

How to improve initial page load time by deferring rendering Livewire components by Freek Van der Herten.

Freek Van der Herten의 Livewire 구성 요소 렌더링을 연기하여 초기 페이지 로드 시간을 개선하는 방법.

Standard API Responses With Laravel Responsables by Wendell Adriel.

Wendell Adriel의 Laravel Responsables를 사용한 표준 API 응답.

Laravel 11: release date and new features by Benjamin Crozat.

Benjamin Crozat의 Laravel 11: 릴리스 날짜와 새로운 기능.

Configuring Laravel Pint by Steve (King) McDougall.

Steve (King) McDougall의 Laravel Pint 구성.

Laravel Pint is an opinionated PHP code style fixer for minimalists

Automatic Docblock Generation on Facades by Paul Redmond.

Paul Redmond의 Facade에서 자동 Docblock 생성.

JhumanJ/OpnForm – Simple and open-source form builder.

JhumanJ/OpnForm – 간단한 오픈 소스 form 빌더.

Laravel Testing Video Course by Povilas Korop (Laravel Daily).

Povilas Korop(Laravel Daily)의 Laravel 테스트 비디오 코스.

기타

What is the minimum number of characters needed to run every possible program in Php?

Benoit Viguier(@b_viguier)의 트윗

재미있네요: (.,^’) 딱 6자 만으로 유효한 #PHP 코드 를 작성하는 새로운 트릭을 찾았습니다
🤯
예, 전혀 쓸모가 없습니다… 그래서 “재미있습니다” 😉

https://b-viguier.github.io/PhpFk/

Php에서 가능한 모든 프로그램을 실행하는 데 필요한 최소 문자 수는 얼마입니까?

이 글에서 Benoit Viguier는 다음 6개의 문자만으로 PHP 스크립트를 실제로 생성하는 방법을 설명합니다 : (.,^').

그는 그 마법을 자동화하는 도구를 만들었습니다 b-viguier/PhpFk.

PhpFk로 만든 “hello world”는 다음과 같습니다.

Hello World with only 6 characters 코드
최종 결과는 Hello World with only 6 characters.

PhpFuck에서 영감을 얻어 PHP 8+에서 동작하는 6개의 문자로만 이뤄진 코드를 만들었습니다. PhpFuck에서는 ' 문자도 필요 없었지만, warning이 발생하므로 추가할 수 밖에 없었다고 하네요.

PHP in 2023 by Brent.

Brent의 2023년 PHP.

My PHP enum style guide by Brent .

Brent의 나의 PHP enum 스타일 가이드.

PHP version stats: January, 2023 by Brent Roose.

Brent의 PHP 버전 통계: 2023년 1월

클라이언트가 packagist.org로 보내는 데이터(예: composer update 명령을 실행할 때)를 기반으로 사용되는 PHP 버전에 대한 정기적인 overview.

PHP 8.*은 클라이언트의 59.7%가 사용하고 있으며 PHP 7.*은 39.1%를 차지합니다. 작년에 각각 45.1%와 53.4%였던 것과 비교하면 PHP 8은 훌륭하게 성장하고 있습니다.

2.6 Million Domains and ~45,000 Exposed Phpinfo() by sdcat.

sdcat의 260만 개의 도메인과 45,000개 이상 노출되어 있는 Phpinfo().
작성자는 info.phpphpinfo.php와 같은 스크립트에 대해 2.6개의 도메인을 스캔했고 그 중 45,000개를 찾았습니다.

이 기사에서 phpinfo()를 노출하는 것이 위험한 이유를 알 수 있습니다.

From open redirect to RCE in one week by Anton Hrytskevich.

Anton Hrytskevich가 일주일 만에 공개 리디렉션에서 RCE로.

Keep Cognitive Complexity Low with PHPStan by Tomas Votruba.

Tomas Votruba의 PHPStan으로 인지 복잡성을 낮게 유지하십시오.

How to release PHP 8.1 and 7.2 package in the Same Repository by Tomas Votruba.

Tomas Votruba의 동일한 저장소에서 PHP 8.1 및 7.2 패키지를 릴리스하는 방법.

PHP Performance in 2022: A Year in Review by Benjamin Eberlei

Benjamin Eberlei의 2022년의 PHP 성능 : 연례 보고서 – Benjamin은 PHP 8.2에서 잘 알려지지 않은 몇 가지 성능 개선 사항을 공유합니다.
예를 들어, PHP 8.2에서 목록 배열은 Dmitry Stogov 덕분에 훨씬 더 메모리 효율적입니다.

100k 정수의 배열 목록을 생성 하는 테스트 스크립트는 메모리 사용량이 4,3MB에서 2,3MB로 감소했음을 보여줍니다.

php-pds/composer-script-name

php-pds/composer-script-name – 공개 리뷰에 사용할 수 있는 composer 스크립트 이름 지정에 대한 새로운 표준입니다.

Paul M. Jones는 철저한 조사를 수행 했으며 PHP 생태계에서 사용할 몇 가지 스크립트 이름을 제안했습니다 . test, test-coverage, test-*, cs-fix, analyze, check.

Compose a Developer Environment easily for PHP with Nix by Soner Sayakci.

Soner Sayakci의 Nix로 PHP용 개발자 환경을 쉽게 구성하십시오.

Video

PHP Annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2022년 12월의 번역/해석본입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


안녕하세요!

PHP Annotated 12월 기사에 오신 것을 환영합니다. 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일들을 따라잡을 것입니다.

News

🎉 PHP 8.2.0 released!

PHP 8.2.0 출시!

PHP 8.2는 PHP 언어의 주요(major) 업데이트입니다. 여기에는 readonly classes, DNF 유형, 독립 실행형 유형으로써의 null / false / true, 새로운 랜덤마이저 API(random extension) 및 trait에서의 상수를 포함한 새로운 기능이 포함되어 있습니다.

이 릴리스에는 몇 가지 지원 중단(deprecation) 사항이 포함되어 있으며, 지원 중단된 동적 속성(dynamic property)이 아마도 가장 중요할 것입니다. 평소와 같이 성능 향상도 있습니다.

PHP 8.2의 새로운 기능에 대한 자세한 목록은 릴리스 페이지를 확인하세요.
또한 PHP.Watch에서 PHP 8.2 Highlights와 동료 Brent 의 PHP 8.2 overview 비디오를 확인하십시오.

PHP 8.2 설치/업그레이드

⚠️ PHP 7 has reached end of life

PHP 7의 수명이 다했습니다.

PHP 7.4.33은 PHP 7의 마지막 릴리스였습니다. PHP 7은 더 이상 공식 보안 업데이트를 받지 않습니다.

그러나 RedHat 또는 Ubuntu와 같은 주요 배포판은 LTS 전제의 일부로 PHP 7.4용 보안 업데이트를 제공합니다.

PHP 8.0.26 and PHP 8.1.13 have been released

PHP 8.0.26PHP 8.1.13이 릴리스되었습니다

🐛 이들은 버그 수정 릴리스 입니다.

PHP 8.0 branch는 활성 지원(active support)을 종료했으며 보안 수정 업데이트만 받게 됩니다.

🎂 PHP Foundation turns 1 year

PHP Foundation이 1년을 맞이합니다.

PHP Foundation은 1 년 전에 설립되었습니다.

지난 1년 동안 PHP 재단은 6명의 핵심 개발자의 작업을 지원 했으며 PHP 언어에 상당한 기여를 했습니다.

2022년 영향 및 투명성 보고서를 확인 하여 달성한 내용을 알아보고 2023년의 높은 수준의 목표를 확인하십시오.

OpenCollective를 통해 PHP 재단을 지원하는 것을 고려하십시오.

PhpStorm 2022.3 is out

PhpStorm 2022.3 출시

이 주요 업데이트는 새로운 UI 미리 보기, 완전한 PHP 8.2 지원, 데이터베이스 도구의 Redis 지원, PHP용 Code Vision, quick-fix 미리 보기, Xdebug 구성 유효성 검사, ParaTest 지원, PHPDoc용 리더 모드, 그리고 다른 많은 기능들.

Symfony 6.2 is out

Symfony 6.2가 출시되었습니다.

더 나은 이모지 지원, 액세스 토큰 인증자, 내장된 Cache+Security+Template+Doctrine Attribute, 개선된 열거형(enum) 지원 등이 있습니다.

이 새로운 릴리스의 하이라이트에 대해 알아보려면 선별된 새 기능 목록(Curated New Features)을 확인하십시오.

📺 PHP Annotated on YouTube

https://www.youtube.com/@phpannotated

PHP Annotated가 PHP Annotated 뉴스레터 외에도 이제 YouTube에 전용 PHP Annotated 채널이 있습니다.

이 채널은 PHP와 커뮤니티에 관한 것이며 Brent Roose의 첫 번째 비디오를 확인할 수 있습니다.

✅ PSR-20: Clock accepted

PSR-20: Clock이 accepted가 됐습니다.

PHP-FIG 그룹은 날짜 및 시간에 대해 권장되는 ClockInterface를 사용하여 PSR-20을 수락하고 태그를 지정했습니다.

🎉 Psalm 5 is out

Psalm 5가 출시되었습니다.

이 릴리스에는 다음과 같은 몇 가지 새로운 기능이 있습니다: list{int, string, float}, properties-of, variable templates, int-range<x, y>.

Xdebug 3.2.0 is out

Xdebug 3.2.0가 출시되었습니다.

이 릴리스는 PHP 8.2에 대한 지원을 추가하고 PHP 7.2-7.4에 대한 지원을 중단합니다. 함수 반환 값 을 검사하는 새로운 기능이 있으며 더 나은 경고 메시지가 제공됩니다.

PHPStan 1.9.0 has been released

PHPStan 1.9.0이 출시되었습니다.

이 업데이트는 PHPDoc 어설션, 목록 유형, reference에 의해 할당된 매개변수에 대한 @param-out 태그 및 기타 개선 사항을 제공합니다.

Drupal 10 is available

Drupal 10을 사용할 수 있습니다.

Symfony 6.2 및 PHP 8.1 이상 필요하며 모든 시스템에서 많은 개선 사항을 추가합니다.

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Core Roundup 시리즈에서 자세히 다루므로 간단히 언급하겠습니다.

📣 PHP RFC: Dynamic class constant fetch #PHP 8.3

PHP RFC: 동적 클래스 상수 가져오기 #PHP 8.3

Ilija Tovilo는 클래스 상수를 찾기 위한 구문 도입을 제안했습니다.

class Foo {    
const BAR = 'bar';
}
$bar = 'BAR';

// This is currently a syntax error
echo Foo::{$bar};

// Instead, the `constant` function must be used
echo constant(Foo::class . '::' . $bar);

📣 RFC: Arbitrary static variable initializers #PHP 8.3

RFC: 임의의 정적 변수 이니셜라이저 #PHP 8.3

Ilija Tovilo는 정적 변수 이니셜라이저에 임의의 표현식을 포함할 수 있는 구문 확장을 제안했습니다.

function bar() {    
echo "bar() called\n";
return 1;
}

function foo() {
static $i = bar();
echo $i++, "\n";
}

foo();

📣 RFC: Readonly amendments #PHP 8.3

RFC: 읽기 전용 수정안 #PHP 8.3

Nicolas Grekas 및 Máté Kocsis는 읽기 전용 속성 및 클래스를 개선하여 ‘읽기 전용이 아닌 클래스’가 ‘읽기 전용 클래스’를 확장할 수 있도록 하고 복제 중에 읽기 전용 속성이 다시 초기화되도록 할 것을 제안했습니다.

readonly class Foo {
public function __construct(
public DateTime $bar
) {}

public function __clone()
{
$this->bar = clone $this->bar;
}
}

$foo = new Foo(new DateTime());
$foo2 = clone $foo;

📊 RFC: More Appropriate Date/Time Exceptions #PHP 8.3

RFC: 보다 적절한 날짜/시간 예외 #PHP 8.3

Derick Rethans는 날짜/시간 확장 관련 예외 및 오류를 도입할 것을 제안했습니다.

📣 RFC: List\unique() and Assoc\unique() #PHP 8.3

RFC: List\unique() 와 Assoc\unique() #PHP 8.3

Ilija Tovilo는 array_unique()에서 지원하지 않는 경우에 대해 두 가지 새로운 기능을 추가할 것을 제안했습니다.

List\unique([1, 2, 3, 1, '2', 3.0, new Foo, ['bar']]);
// > [1, 2, 3, '2', 3.0, Foo, ['bar']]

Assoc\unique(['foo' => 'foo', 'bar' => 'bar', 'baz' => 'foo']);
// > ['foo' => 'foo', 'bar' => 'bar']

📣 RFC: Unicode Text Processing #PHP 8.3

RFC: 유니코드 텍스트 처리 #PHP 8.3

Derick Rethans는 유니코드 텍스트 처리의 모든 복잡성을 알 필요 없이 훨씬 개발자 친화적으로 유니코드 텍스트를 사용하고 처리할 수
있는 새로운 Text 클래스를 도입할 것을 제안합니다.

$content = new Text('नमस्ते दुनिया');
if ($content->toLower()->startsWith('नमस्ते')) {
// ...
}

Tools

@phptinker

Marcel Pociot는 @phptinker를 언급하면 GitHub issues에서 PHP 코드 블록을 평가(evaluate)하는 깔끔한 GitHub 봇을 만들었습니다.

phptinker 예시

ramsey/uuid

ramsey/uuid – 어디에서나(universally) 고유한 식별자를 생성하기 위한 패키지의 새 버전은 UUID v8 및 사용자 지정 UUID를 지원합니다.

loophp/collection

loophp/collection – 메모리 친화적인 모듈식 컬렉션 클래스가 새로운 major 버전인 7.0.0을 출시했습니다.

php-rust-tools/parser

php-rust-tools/parserRyan ChandlerSaif Eddin이 Rust로 작성하며 아직 작업 중인 PHP 파서입니다.

어쩌면 당신은 언제든 순수하고 안전한 Rust를 사용하여 PHP 확장을 작성할 수 있게 해주는 도구인 PHPer에도 관심이 있을 것 입니다.

ScriptFUSION/Porter

ScriptFUSION/Porter – 규모에 맞게 데이터를 소비하고 테스트 가능한 SDK를 배포(publishing)하기 위한 내구성 있는, 비동기식으로 데이터 가져오는 도구(importer).

PHP client for OpenAI

ChatGPT가 모든 것을 대체하고 있으므로 OpenAI용 PHP 클라이언트를 확인하고 싶을 수 있습니다.

  • openai-php/client – OpenAI API와 상호 작용할 수 있는 강력한 PHP API 클라이언트입니다.
    orhanerday/open-ai – OpenAI GPT-3 API에 액세스하기 위한 PHP SDK입니다.

qossmic/deptrac 1.0

qossmic/deptrac 1.0 – 애플리케이션 계층 간의 종속성을 결정하기 위한 프로젝트 아키텍처 분석 도구입니다.

revoltphp/event-loop 1.0.0

revoltphp/event-loop 1.0.0 – 이 이벤트 루프는 ReactPHP와 Amphp 관리자 간의 공동 노력입니다. 이제 production에서 사용할 준비가 되었으며 다양한 응용 프로그램 및 시나리오에서 테스트되었으며 fiber를 완벽하게 지원합니다.

a docker registry, which magically adds a docker layer for each extension requested with image

Shyim(@Shyim97)의 트윗

몇 년 동안 #docker를 사용한 #PHP 확장에 짜증이 났습니다. install-php-extensions가 도움이 되지만 여전히 확장을 컴파일해야 합니다.
그래서 이미지로 요청된 각 확장에 대한 도커 레이어를 마술처럼 추가하는 도커 레지스트리를 구축합니다. 이것은 실험적입니다!

php.shyim.de 사용 예시

rob893/emoji-cache

rob893/emoji-cache – LRU 캐시 구현이지만 모든 식별자는 이모티콘입니다.

emoji-cache 사용 예시

Symfony

API rate liming per route in Symfony 6.1 by Christian Nielebock.

Christian Nielebock의 Symfony 6.1에서 route당 API 속도 제한.

Asserting the output of Symfony console commands by Andreas Möller.

Andreas Möller의 Symfony 콘솔 명령 출력 어설션.

Discover Symfony UX components and enhance your front-end by Jakub Tobiasz.

Jakub Tobiasz의 Symfony UX 구성 요소를 살펴보고 프런트엔드를 개선하십시오.

Centralized exception handling with Symfony and custom PHP attributes by Dejan Angelov.

Dejan Angelov의 Symfony 및 맞춤형 PHP 속성을 사용한 중앙 집중식 예외 처리.

Laravel

Laravel best practices: the definitive guide for 2022 by Benjamin Crozat.

Benjamin Crozat의 Laravel best practices: 2022년 최종 가이드.

Table of contents

  • Keep Laravel up to date
  • Keep packages up to date
  • Keep your project tested
  • Stick to the default directory structure
  • Use custom form requests
  • Use single action controllers
  • Use policies
  • Prevent N+1 issues with eager loading
  • Use Eloquent’s strict mode
  • Use the new way of declaring accessors and mutators
  • Use anonymous migrations (Laravel 8 and above)
  • Use the down() method correctly
  • Use dispatchAfterResponse() for long-running tasks
  • Use queues for even longer running tasks
  • Lazily refresh your database
  • Make use of factories
  • Test against the production stack whenever it’s possible
  • Use database transactions
  • Don’t waste API calls, use mocks
  • Prevent stray HTTP requests
  • Don’t track your .env file
  • Don’t track your compiled CSS and JavaScript

Are Your Queue Workers … Working? by Jamison Valenta.

당신의 queue worker는… 일하고 있습니까?

대기열이 실행 중인지 확인하기 위해 Envoyer의 heartbeats 사용.

Using Generators for Pagination by James Bannister.

James Bannister의 Pagination을 위한 Generator 사용.

Unique jobs and reserving resources on the queue by Tim MacDonald.

Tim MacDonald의 대기열에 있는 고유한 작업 및 예약 리소스.

ShouldBeUniqueWithoutOverlapping을 활용해 큐에서의 원자적 잠금을 구현합니다.

A Look at What’s Coming to Laravel 10 by Paul Redmond.

Paul Redmond가 쓴 Laravel 10의 새로운 기능 살펴보기.

Save 1 million queries with Laravel Eager Loading by Valerio Barbera.

Valerio Barbera의 Laravel Eager Loading으로 하루에 백만 쿼리를 줄인 방법.

Laravel에 대한 Rector 규칙 세트Rector를 사용하지 않더라도 어쨌든 이 링크를 확인하십시오! Laravel 프로젝트에 대한 몇 가지 흥미로운 리팩토링 예제(diff)가 있습니다.

이외의 프레임워크

기타

24 Days in December

12월의 24일

매년 12월의 첫 24일 동안 PHP 커뮤니티 회원들이 생각을 공유합니다. 다음은 언급할 가치가 있는 몇 가지입니다.

Generics via Attributes in PHP by Roman Pronskiy.

Roman Pronskiy의 PHP에서 Attribute를 통한 제네릭.

PHP에서 제네릭을 검토했던 과정과 논의 내용을 소개하고 아래와 같은 방식으로 Attribute를 활용한 제네릭을 사용하는 것은 어떤지 질문합니다.

#[<T>]
class Stack
{
public function push(#[<T>] mixed $item): void
{
}

public function pop(): #[<T>] mixed
{
}
}

From annotations to attributes by Grégoire Paris.

Grégoire Paris의 annotation에서 attributes까지.

Doctrine project에서 ORM의 테스트를 annotation 방식에서 attribute 방식으로 변경한 과정을 설명합니다.
Rector를 통해 쉽게 변환됐고(2개의 오류만 발견), 변경점은 Run Rector라는 커밋으로 확인해보실 수 있습니다.

How to Measure Your Type Coverage by Tomas Votruba.

Tomas Votruba 의 Type Coverage를 측정하는 방법.

A story of Lazy Loading File System Operations for better dev system performance by Benjamin Eberlei.

Benjamin Eberlei의 더 나은 개발 시스템 성능을 위한 레이지 로딩 파일 시스템 작업에 대한 이야기.

Video

📺 Writing declarative PHP by Andrew Schmelyun.

Andrew Schmelyun의 선언적 PHP 작성.

📺 What’s New in PHP 8.2 by MergePHP.

MergePHP가 제공 하는 PHP 8.2의 새로운 기능.

📺 Guido van Rossum (creator of Python) and Lex Fridman discuss the $ sign in PHP variable names

Guido van Rossum(Python 창시자)과 Lex Fridman이 PHP 변수 이름의 $ 기호에 대해 논의합니다: Lex Fridman on PHP 프로그래밍.

Conferences


해피 홀리데이, PHPers! 🎄🐘

목차

  • 낡은 캐시 서버를 교체하라
  • 섣부른 서버 교체, 죄송합니다
  • ElastiCache의 지표들을 이해해봅니다
  • 애플리케이션 서버에서 문제를 찾아봅시다
  • 살려야 한다
  • 살려는 드렸는데…
  • 마무리
  • 부록 : 도입하는 과정에서 알게 된 잡다한 지식

“식은땀이 흐르는 Redis 서버 교체기 1편”에서 이어지는 글입니다.

이전 글에서는 섣부르게 Redis 서버를 교체하면서 장애를 맞았던 경험을 공유하고, 놓치고 있던 지표를 정확히 이해하기 위해 찾아본 문서를 소개했습니다.

각종 지표를 통해 신규 커넥션의 수 혹은 많은 커넥션 자체가 Redis 서버의 CPU 사용량을 늘리고, 이것이 장애로까지 이어졌을 거라고 분석했습니다.
이번 글에서는 Redis 서버에 부하를 줄이기 위한 여러 가지 시도와 앞으로 더 시도해볼 만한 방법을 공유합니다.

애플리케이션 서버에서 문제를 찾아봅시다

persistent connection

1차 시도 때 기존 사용하던 서버가 교체된 후 애플리케이션에서의 요청이 사라졌음에도, 현재 연결(CurrConnections) 지표는 줄어들지 않고 그대로 유지되는 것이 마음에 걸렸습니다.

첫 번째 시도에서의 Redis 지표 이미지

  • 애플리케이션 서버로부터 연결이 들어오지 않아 수신/송신 네트워크가 줄어들고 캐시 된 아이템(현재 항목)은 하나씩 만료돼가는 모습
  • 좌 하단의 현재 연결 지표는 거의 줄어들지 않았습니다

찾아보니 비슷한 경험 stackoverflow에도 올라와 있었습니다.

여기서 언급된 Redis 문서에서 Client Timeouts 부분을 보시면 Redis에서는 원래 연결을 끊지 않는 것으로 보입니다.

By default recent versions of Redis don’t close the connection with the client if the client is idle for many seconds: the connection will remain open forever.

그동안 커넥션 수가 늘어남에 따라 문제가 발생하지 않았을까 강한 의심을 하고 있었기 때문에 커넥션을 줄일 방법을 좀 더 찾아보기로 했습니다.

위 Redis 문서에 나온 것처럼 timeout 설정도 그 방안 중 하나인데, Amazon ElastiCache for Redis는 CLI로 수정이 되지 않고 파라미터 그룹을 생성해서 적용해야 합니다.

동료 중 한 분은 persistent 옵션을 사용해보는 건 어떨지 제안을 주셨는데

파라미터로 쉽게 적용 가능하고, 여러 서버군 중에 일부만 환경변수로 쉽게 제어도 할 수 있었으므로 timeout 설정보다 먼저 시도해보기로 했습니다.

Redis 설정에 'persistent' => 1, 한 줄만 추가하면 됩니다.

'redis' => [
'client' => 'predis',
'default' => [
'scheme' => env('REDIS_SCHEME', 'tcp'),
...
'persistent' => env('REDIS_PERSISTENT', 0),
],
],

한번의 request 안에서의 연결은 재사용되는지 궁금했습니다.

// 코드는 중요하지 않음. 한번의 put과 여러번의 get을 호출하는 상황
for ($i = 0; $i < 4; $i++) {
$time = microtime(true);
Cache::put('test.' . $time, $time, 1);
Cache::get('test.' . $time);
Cache::get('test.' . $time);
Cache::get('test.' . $time);
Cache::get('test.' . $time);
}

연속으로 5회 request 시도해봤을 때는 신규 connection이 하나만 생성되는 걸 확인했고, 아래와 같이 동시에 여러 번 쏴본 테스트에서도 개선 효과가 뚜렷했습니다.

ab -n 50 -c 10 https://test_url
  • PERSISTENT=1 -> 신규 커넥션 15
  • PERSISTENT=0 -> 신규 커넥션 50

5일에 걸쳐 영향 범위가 적은 서버부터 차례로 적용해보았습니다. 아래는 마지막 트래픽이 많은 서버군에 적용된 후의 모습인데, Current/New connection 지표는 예상대로 바뀌었습니다.

persistent 옵션 적용 후 Redis 지표 이미지

  • 신규 커넥션이 줄었기 때문에 CPUUtilization이 낮아진 건 예상했지만 EngineCPUutilization 수치도 상당 부분 내려간 것이 의외였습니다.
  • 여기에는 보이지 않지만, 애플리케이션 서버 자체의 CPU 지표에는 큰 변화가 없었습니다. 다만 애플리케이션 서버 쪽 ELB Latency는 소폭(약 10ms) 낮아진 것도 확인할 수 있었습니다.

애플리케이션 서버 스펙을 올리기

커넥션을 물고 있는 애플리케이션이 조금 더 빠르게 처리되고 끝날 수 있게 애플리케이션 서버의 스펙을 두 배로 올리는 실험도 해보았습니다.
Pod의 CPU request를 두 배로 늘려주니 Pod 수는 절반 이하로 줄었고, Current connections가 약 10%가량 줄어들었습니다.
New connection에서는 체감할 만한 변화는 없었습니다.

애플리케이션에서 문제 찾기

코드에서는 잘못된 사용 패턴이 없는지도 점검했습니다.
7년 이상 된 서비스라, 과거엔 성능에 거의 영향을 주지 않던 코드가 시스템에 큰 충격을 주는 경우를 종종 만나게 됩니다.

has-get / has-del 패턴 없애기

New Relic에서 확인했을 때 Redis를 활용하는 사용량 기준 상위권에 속하는 코드에서 불필요하게 한 번 더 쿼리하는 패턴을 발견합니다.
‘캐시가 존재하면 가져온다’, ‘캐시가 존재하면 지운다’와 같은 패턴입니다.

if ($this->cache->has($cacheKey)) {
$cached = $this->cache->get($cacheKey);
//do something
}

Laravel의 cache repository의 구현체를 보니
vendor/laravel/framework/src/Illuminate/Cache/Repository.php:68

public function has($key)
{
return ! is_null($this->get($key));
}

get을 시도한 후 null 체크만 하면 되는 것이었습니다.

if ($cached = $this->cache->get($cacheKey)) {    
//do something
}

client에서 polling 줄이기

서비스를 시작한 후로 많은 세월이 흘러, 클라이언트에서 polling 하는 API가 하나둘 씩 늘어나게 되었습니다.
매 polling마다 Redis를 활용한 체크 로직이 많았는데, polling 하는 데이터의 성격상 한번에 쿼리해도 되거나 push로 대체할 수 있는 것들이 보였습니다. 해당 API를 담당하시는 분들이 이 부분도 빠르게 개선해주셨습니다.

phpredis

C로 작성된 PHP extension인 PhpRedis는 pure PHP인 Predis 보다 성능 면에서 월등한 것으로 나타납니다.
벤치마크 참고 : https://akalongman.medium.com/phpredis-vs-predis-comparison-on-real-production-data-a819b48cbadb

Laravel 6.x 버전부터는 문서에서 phpredis를 predis보다 먼저 소개합니다.
https://laravel.com/docs/6.x/redis

we encourage you to install and use the PhpRedis PHP extension via PECL

phpredis로 전환하기 위해선 아래 블로그를 참고하시면 됩니다.
https://www.lesstif.com/dbms/php-phpredis-redis-23757275.html

그런데 phpredis가 설치된 이미지를 빌드해서 서버를 띄워봤지만, 연결이 되지 않았습니다.
일단 특수한 상황으로 보이긴 했는데요.

https://bugs.php.net/bug.php?id=79501
2022년에 올라온 PHP 버그 리포트에서도 비슷한 문제를 발견했는데, PHP 7.4 버전에서 TLS 1.3을 사용할 때 유독 문제가 발생한다는 것이었습니다.

https://github.com/phpredis/phpredis/issues/1881
phpredis에 관한 이야기지만 PHP와 Linux 둘 중 하나에 버그가 있는 게 아니냐는 논의이고,
마지막에 보면 커넥션을 수없이 열고 닫는 과정에서 발생하는 것 같고 레디스 사용을 줄이면서 오류도 줄였다는 내용도 보입니다.

PHP 8.0 버전에서는 문제없는지 정도만 빠르게 확인해봤습니다.
PHP 8.0 + 라라벨 기본 애플리케이션으로 서비스를 올리고 테스트해 보니 잘 연결이 되는 걸 확인했습니다.

어쩌면 PHP 7.4 + TLS + 아이디/비번으로 연결하는 경우만 그럴 수도 있어서 더 찾아보면 방법이 있을 수도 있는데, 그 노력을 아껴서 다른 곳에 쓰기로 했습니다. 곧 PHP 8버전대로 올릴 때 자연스레 PhpRedis로 이전할 수 있을 것 같았습니다.
(버전업이란 게 항상 그렇듯 아직 진행은 안 되고 있는데 말이죠..)

살려야 한다

이미 간이 콩알만 해진 관계로 한 번에 여러 가지를 시도하지 않고, 단계별로 진행해 볼 계획을 세웠습니다.

  1. 6.2 버전의 신규 Redis 서버를 RBAC 인증도 가능하고 현재처럼 특별히 인증 없이 default user로 접근할 수도 있게 설정
  2. default 유저를 사용해 서비스에 투입
    • 이때 cache.m5.4xlarge(16vCPU)로 좀 더 과감하게 스케일업
  3. 이후 RBAC 적용하고
  4. 이후 default 인증 제거

배포 전 미리 두 가지 인증 방식으로 연결이 잘 되는지 확인해봤습니다.
TLS 연결 설정은 나중에 변경하기 어려운 상황이어서 default 유저에 TLS 연결로 우선 적용해보기로 했습니다.

상용 환경 투입

세 번째 도전 시 Redis 지표 이미지 1

세 번째 도전 시 Redis 지표 이미지 2

  • TLS 연결 + Redis 인스턴스 타입 교체 + default 인증
    • cache.m5.xlarge(4vCPU) -> cache.m5.4xlarge(16vCPU)
  • 예상대로 EngineCPUutilization 지표(파란색)가 높아졌고, 16코어의 큰 인스턴스를 쓰기 때문에 CPUUtilization 지표는 참고만 하고 예민하게 보지 않기로 했습니다.

RBAC은 조심스럽게 적용했는데, 여러 서버군을 사용량과 적고 영향 범위를 기준으로 5가지로 나누고, 서비스에 영향이 적은 서버들부터 5일에 걸쳐 적용했습니다. 아래는 마지막으로 적용한 이후의 그래프인데, AUTH 커맨드의 추가 실행이 필요하므로 예상대로 EngineCPUutilization가 올라갔지만, 서버는 안정적으로 유지되고 있습니다.

RBAC 적용 후 Redis 지표 이미지 1

그리고 일주일 후, default 인증을 제거하면서 최종 마무리가 됐습니다.

살려는 드렸는데…

마지막에 꽤 큰 인스턴스 타입으로 바꾸었기 때문에, 이제 비용을 줄이기 위해선 더 낮은 사양으로 낮춰보거나 현재 사양이 적정하다는 것을 확인해야 하는데, 추가 개선안으로 적용해볼 것이 아직 많이 남아 고민 중에 있습니다.

read connection

replica를 더 두고 reader endpoint를 사용해서 읽기 연결을 분산하는 방법입니다. 현재의 replica는 장애 대비로만 존재하기 때문에 읽기 전용 연결을 하려면 replica를 추가해야 할 것입니다.

그런데 Reader endpoint를 바라보는 커넥션을 별도로 두고, 읽기만 발생하는 곳에서 명시적으로 읽기 커넥션을 지정해야 하는데, 사용성이 좋지 않고 검토하고 수정할 범위가 넓어서 당시엔 배제하였습니다.

캐시 서버를 분리

전체 애플리케이션이 레디스 클러스터 하나에 붙어 운영하다 보니 그만큼 레디스 서버 스펙도 높아질 수밖에 없는 구조입니다.
하위 서비스별로 각자 사용할 캐시를 분리하면 위험을 분산하고 성능을 높일 수 있습니다. 혹은 세션 등 공통으로 사용할 만한 부분부터 분리해나가는 것도 고려해볼 만합니다.

경계 확인하기

현재의 Redis 스펙으로 얼마나 버틸 수 있는지 확인해봐야 합니다.
현재는 EngineCPUutilization 지표가 피크 기준 30% 선을 유지하지만, 몇 % 정도 더 오르면 다시 교체하거나 최적화를 고민해야 할지 정해놔야 합니다.

Istio

제가 커넥션 문제로 고민하고 있을 때, 10년 전 같이 일했던 선배 개발자들과 이야기를 나눴었습니다. Redis는 아니었지만 캐시를 많이 사용하던 서비스였고, 그때도 커넥션 관리에 문제가 많아서 커넥션 풀을 제공하는 중간 서버를 하나 두었었다는 이야기를 들었습니다.

직접 만드는 것도 방법이겠지만, Envoy Proxy라는 솔루션을 활용할 수도 있습니다. Istio가 제공하는 수많은 기능 중에서도 proxy나 서킷 브레이커가 특히 유용할 것으로 보이는데, 애플리케이션을 수정하지 않고도 쉽게 붙일 수 있다는 점에서 긍정적으로 도입을 검토해볼 만합니다.

reddit에서의 답변
https://www.reddit.com/r/PHP/comments/sikoux/are_persistent_connections_to_mysqlredis_good/

  • envoy proxy를 sidecar로 붙여서 활용하는 방법 : “앱은 추상 유닉스 소켓을 사용하여 envoy에 연결하고 envoy 자체는 연결을 지속적으로 다시 만들 필요가 없도록 일정 시간 동안 연결을 유지합니다.”

Envoy를 사용하여 PHP Redis 클라이언트 성능을 개선하는 방법
https://angelbear.github.io/blogs/2021/07/envoyfilter-improve-php-redis-client/

  • 주의할 점으로
    • 중간자가 존재하므로 개별 읽기/쓰기 성능은 낮아짐 -> 전체 성능은 올라감
    • 너무 많은 ESTABLISHED 연결 -> 너무 많으면 새로운 연결에 문제가 생길 수 있음
    • timeout 설정으로 커넥션이 너무 오래 지속되지 않도록 처리 필요

cachewerk/relay

https://github.com/cachewerk/relay

아직 안정화는 안 됐지만, 검색 결과를 in-memory cache에 저장해서 캐시 요청을 줄이는데 활용할 수 있음.

더 읽어보기

Best practices: Redis clients and Amazon ElastiCache for Redis

  • 복제본에서 읽기 / 쓰기 분산
  • Lettuce, Python에서의 연결 pool 구성
  • 클러스터 모드일 때 해볼 만한 팁
    등이 포함되어 있습니다

마무리

오래전 글이지만, 이 작업 이후 다시 읽고 새롭게 다가왔던 문장을 소개하며 마칩니다.

Richard Cook의 How Complex System Fail 사례

  1. 모든 실무자의 행동은 도박이다.
    장애 이후에 실패는 종종 피할 수 없는 것처럼 보이며, 실무자의 행동은 실수로 보인다. 그러나 모든 실무자의 행동은 실제로 도박, 즉 불확실한 결과에 직면하여 발생하는 행동이다. 불활실성의 정도는 변할 수 있다. 실무자의 행동이 도박이라는 사실은 장애 이후에 알게된다. 일반적으로 사후 분석에서는 이러한 도박을 빈약한 도박으로 간주한다. 그러나 성공적인 결과 또한 도박의 결과이기도 하다.

1차, 2차 그리고 안정적으로 유지하게 된 최종 적용 과정에서도 많은 도박 요소가 있었습니다.
그것이 도박이었다는 것을 뼈저리게 느끼게 해 준 시간이었고, 오랜 시간 쌓인 기술 부채를 도박으로 탕감하려는 시도를 했구나 싶었습니다.

마지막 시도 과정에서는 심지어 이런 일도 있었습니다.
Pod의 CPU request를 두 배로 늘려주는 과정에서 CPU 기준의 AutoScaling이 동작했는데, 그때가 8시 반쯤 트래픽이 적을 때여서 minimum pod 수만 남기고 모두 삭제되었습니다.
9시 정각, 모 업체에서 오픈런 이벤트로 많은 요청을 보내기 시작했습니다. 웹서버의 절대적 수가 부족한 상황에서 갑자기 커다란 트래픽을 맞아 휘청했죠. ‘좋은 하드웨어로 갈아주는데 설마 무슨 문제가 있겠어?’라고 안일하게 생각했다가 다시 한방 크게 먹었습니다.
하지만 이 날 무사히 넘어갔어도 언젠가 누군가 (누구의 탓인지 모른 채) 같은 문제는 겪었을 것입니다.

위에 소개드린 “How Complex System Fail”을 요약한 GeekNews의 글만 읽어보고는 잘 알지도 못하면서 너무 쉽게 선택한 스스로를 반성했습니다. 그건 그것대로 반성할 만 하지만,

원문을 읽어보니 도박이라서 안 좋다는 걸 강조하는 것보다는, 복잡한 시스템에서의 선택은 불확실성을 내포하는 도박과 같다는 의미로 읽혔습니다.
장애의 원인과 해결책을 너무 쉽게 판단하는 것 역시 경계해야 할 일이라고.
(사실 원문이나 링크된 강의 동영상에서의 문장이 너무 어려워서 잘 이해했는지 모르겠어요)

내가 맡은 서비스가 복잡한 시스템은 맞는 건가 의문도 들지만, 많은 노하우를 쌓을 수 있었던 경험이었습니다.

위 Richard Cook의 글의 마지막 항목을 읽어볼까요?

  1. 실패없는 작업에는 실패 경험이 필요하다.
    … 중략 … 오류와 긴밀한 접촉이 필요합니다. 운영자가 시스템의 한계를 식별할 수 있는 시스템에서 보다 강력한 시스템 성능이 발생할 수 있습니다.

마지막 시도에서 cache.m5.xlarge에서 cache.m5.4xlarge로 과감하게 올렸지만, cache.m5.2xlarge로는 버틸 수 없었을까 미련이 남기도 합니다. AUTH 커맨드가 추가되고 TLS 연결을 위한 추가로 필요한 성능이 넉넉잡아 각각 2배로 필요하다고 가정하면, 최초 cache.m5.large에서 4배로 성능을 높인 cache.m5.2xlarge로도 운용 가능하지 않을까 생각도 듭니다.
현재는 피크에 30%까지만 올라가고 있어서 여유는 있습니다. 당장 무리하게 내릴 생각은 없는데, 문제가 생기기 시작하는 경계를 확인하지 못해서 그만큼의 불안함을 비용으로 지불하고 있구나 생각이 들었습니다.

부록 : 도입하는 과정에서 알게 된 잡다한 지식

SLOWLOG

Redis에는 SLOWLOG 커맨드가 있습니다.
오랜 시간 수행되는 쿼리는 없는지 확인 해볼 수 있습니다. 이번 커넥션 오류와 관련해서도 체크해보았지만, 특별히 느린 커맨드가 보이진 않았습니다.

SLOWLOG 확인 예시:

레디스호스트:6379> SLOWLOG LEN
(integer) 128
레디스호스트:6379> SLOWLOG GET 2
1) 1) (integer) 1134
2) (integer) 1669848600
3) (integer) 10910
4) 1) "GET"
2) "loadClientByClientId::ebf29050-1184-4d3e-a057-fe7a13b86be5"
5) "10.160.33.73:42436"
6) ""
2) 1) (integer) 1133
2) (integer) 1669842000
3) (integer) 16057
4) 1) "INFO"
2) "server"
5) "10.160.33.73:40684"
6) ""

Laravel JWT Token Blacklist

서비스에 일시 들어갔다 나온 서버에 무작정 접근해서 문제가 될 만한 데이터가 있는지도 확인해봤습니다.

laravel로 시작하는 다수의 캐시 목록

위 캡쳐와 같이 laravel:로 시작하고 valid_until 정도의 값만 갖고 있는 데이터가 다수 있는 걸 확인했습니다. JWT-auth에서 사용되는 것 같다는 동료의 조언에 따라 뭔가 짚이는 게 있어 실험을 해봤습니다.

로그아웃 테스트 이후의 캐시 목록

이 캡쳐는 로컬 레디스에서 데이터를 깨끗하게 지운 후, 클라이언트에서 로그인/로그아웃을 세 번 정도 한 결과인데요.
로그아웃을 할 때마다 해당 토큰을 blacklist에 영원히(ttl:-1) 저장합니다.

laravel:629ef98ae36a3133817307:standard_ref 이런 식의 키인데, 값은 만료된 키를 저장하고 있죠.

[
"laravel:00a8bf31198fd179db62cf828b57299c427eafed:31VvhJ7qURid7ymg", "laravel:00a8bf31198fd179db62cf828b57299c427eafed:FfIgHkNo02Y0Aayv", "laravel:00a8bf31198fd179db62cf828b57299c427eafed:NNJGoZqX9ldAdFBU"
]

현재는 이런 데이터가 영원히 늘어나기만 하는 구조입니다.

  • 관련 코드는 \Tymon\JWTAuth\Manager::invalidate() 참조

비활성화된 토큰으로 인증을 통과하지 못하게 막는 건 중요합니다. 그러나 발행된 모든 토큰을 영원히 저장하는 것도 효율적이지 않으므로 한번 모두 삭제하기로 했습니다. 캐시라면 언제든 초기화될 수 있는 데이터라고 생각하고 운용하는 것이 좋다고 생각하기도 하고요. 누군가 마침 만료된 토큰을 구해서 접근할 경우 보안에 구멍이 생기기도 하겠죠. 완벽한 방법은 아니지만, 저희 애플리케이션에서는 강제 만료 시간을 설정할 수 있게 해 놓고, 이보다 이전에 발행된 토큰은 사용할 수 없게 보완하였습니다.

Redis 6.0 default user 버그

옆 팀에선 Redis 6.0 버전 때문에 개발 환경에서 장애가 발생한 적이 있었습니다.

default user를 사용하지 못하게 권한을 조정하는 작업 중이었는데, Redis 6.0 버전에선 default user에 권한이 없을 때 HELLO 커맨드가 실패하는 버그가 있었습니다.

이는 6.2.2 버전부터 해결 됐습니다.

< 끝 >

0%