ha-ah

로그, 게으른 로그

PHP Annotated 이미지

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


여러분 안녕하세요!

엄선된 뉴스, 기사, 도구, 동영상 등 지난 한 달간 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 버전부터 해결 됐습니다.

< 끝 >

올여름 Redis 서버 교체 과정에서 여러 번의 장애를 겪은 후 뼈에 새기는 반성문입니다.

목차

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

낡은 캐시 서버를 교체하라

오랜 시간 큰 문제 없이 사용하던 Redis 서버가 있었습니다.

TLS 연결도 없이 default user를 사용했는데, Laravel 애플리케이션의 database.php 파일 설정은 이렇게 간단했죠.

...
'redis' => [
'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
],
...

보안취약점 개선 작업을 준비하던 과정에서 EOL 소식도 들었습니다(Redis 버전의 수명 종료 일정 참고).

redis eol warning 이미지

개선하는 김에 버전도 Redis 6.2 이상으로 올리고
default user를 사용하는 대신 최신 버전에서 지원하는 역할 기반 액세스 제어(RBAC)를 사용한 사용자 인증,
여기에 TLS 연결까지 적용하기로 했어요.

섣부른 서버 교체, 죄송합니다

이제 조금 더 복잡해진 설정.

'redis' => [
'client' => 'predis',
'default' => [
'scheme' => env('REDIS_SCHEME', 'tcp'),
'ssl' => ['verify_peer' => env('REDIS_VERIFY_PEER', true)],
'host' => env('REDIS_HOST', '127.0.0.1'),
'username' => env('REDIS_USERNAME', null),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE', 0),
],
],

테스트 환경과 트래픽이 낮은 다른 서비스에 미리 도입해서 잘 동작하는 것은 확인했습니다.

연결 테스트:

# openssl 설치
apt-get update;apt-get install -y openssl;

# 서버 연결
openssl s_client --connect 신규레디스호스트명:6379

# 인증
AUTH <username> <password>

애플리케이션 테스트 by tinker

Psy Shell v0.9.12 (PHP 7.4.33 — cli) by Justin Hileman
>>> config('database.redis');
=> [
...
]
>>> Cache::put('test', 'testval', 1); Cache::get('test');
=> "testval"

1차 시도

오전 8시경 트래픽이 비교적 많은 서비스에 넣어봤습니다.

저희 서비스는 식당이 주 고객이라서 매장 오픈 시간부터 트래픽이 몰리는데, 특히 11시부터 2시까지를 오전 피크로 보고 있습니다.
AWS에서 운영 중인 API 서버군의 ELB Latency 지표는 일반적으로 130ms ~ 150ms 사이를 유지하고 있습니다.

여기서 ELB Latency란, “로드 밸런서가 등록된 인스턴스에 요청을 보낸 시간부터 인스턴스가 응답 헤더를 보내기 시작할 때까지 경과된 총시간(초)”을 의미합니다. (elb-cloudwatch-metrics 문서 참고)

그런데 오전 11시를 넘어서며 ELB Latency가 급격히 오르기 시작합니다.

elb latency가 오르는 모습 이미지

지표를 확인한 순간 바로 롤백을 진행했지만 5분에서 10분 정도의 장애가 발생했습니다.

바로 AWS Premium Support에 case를 열어 어떤 일이 있었는지 문의를 해봤고,
내부 툴로 확인한 결과라며 답변을 주셨는데, 요약하면 이렇습니다.

서비스 투입되고 일정 시간 동안의 지표를 비교해본 결과

  • 신 Redis로 교체 시
    • CPUUtilization: 15% -> 60% , EngineCPUutiliaztoin: 22% -> 99% , Total Cmds: 기존 대비 거의 두 배로 증가
    • HitRate는 투입 후 2시간에 걸쳐 0%에서 51%까지 상승
  • 다시 구 Redis로 교체 시
    • CPUUtilization: 15% ~ 17% , EngineCPUutiliaztoin: 16% -> 18% , Total Cmds: 20% 증가

추가로 아래와 같이 제안도 주셨습니다.

  • 가장 데이터가 적은 시간대에 Redis 교체를 고려
  • 기존 Redis의 데이터를 백업 후 Restore 하여 6.2 버젼의 Redis를 시작(캐쉬데이터의 TTL 이 너무 짧지 않으면)
  • 기존(cache.m5.large)보다 큰사이즈(cache.m5.xlarge 또는 그 이상)로 시작하였다가, 추후 Online scaling down을 통하여 크기를 줄이는 방법

아마도 RBAC을 적용하면 AUTH 명령을 추가로 실행하기 때문에 전체 커맨드 수가 많이 증가했을 것이고, 캐시가 비어 있는 새로운 서버를 띄우면서 HitRate가 지나치게 낮은 것이 문제가 됐을 거라고 판단했습니다.

2차 시도

기존 cache.m5.large(2vCPU)에서 cache.m5.xlarge(4vCPU)로 인스턴스 타입을 올렸습니다.
교체 전 스냅샷을 생성하고(10분 이내), 스냅샷으로부터 신규 Redis 서버를 생성했습니다(30분 이내)

이번에는 엔진 지표도 함께 볼 수 있게 모니터링 대시보드를 설정했습니다.

EngineCPUUtilization 추가된 1차 시도의 Redis 지표 이미지

  • 1차 장애 당시 신규 투입된 서버의 CPUUtilization, EngineCPUUtilization 지표
  • 당시에는 EngineCPUUtilization를 보고 있지 않아서 100%까지 치고 올라가는 상황을 인지하지 못했었습니다.
  • 그림에서 레디스 서버가 두 대인 것을 확인할 수 있는데, 두 대가 클러스터로 묶여(cluster mode 아님 주의) 한대가 장애가 날 경우를 대비하고 있습니다. 애플리케이션은 primary node만 바라보고 있습니다.

교체 시작!

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

  • Redis는 어쩐지 안정적인 것 같았습니다.

하지만 애플리케이션 서버 쪽 ELB Latency 지표는 200ms를 넘어가고 있었고, New Relic에서 확인한 연결 지연 시간(아래 그래프)이 심상치 않아 다시 롤백을 결정했습니다.

New Relic에서 바라 본 두번째 시도에서의 Redis query 시간 이미지

두 번의 실패 이후, 많은 반성을 하면서 ‘나는 뭘 모르고 있는지’ 찬찬히 돌아보기로 했습니다.

ElastiCache의 지표들을 이해해봅니다

EngineCPUUtilization

기존 사용하던 Redis 서버와 새로 띄운 서버는 몇 가지 지표에서 차이가 나긴 했지만, 모두 AWS Redis 지표 페이지에서 권고하는 수준 안에 있었습니다.

이 문제를 해결하기 위해 CPUUtilization와 EngineCPUUtilization는 물론이고, connection 관련 지표에 집중해서 모니터링하기로 했습니다.

첫 번째 장애 때의 그래프를 다시 가져와 봅니다.

EngineCPUUtilization 추가된 1차 시도의 Redis 지표 이미지

CPUUtilization은 EngineCPUUtilization보다 낮았습니다.

CPUUtilization은 Redis 엔진(EngineCPUUtilization으로 표현)의 동작에 백그라운드 프로세스의 비용도 포함하기 때문에 이 값이 EngineCPUUtilization보다 낮은 게 이상하다고 생각했습니다.

Amazon ElastiCache for Redis 사용 설명서 > 어떤 지표를 모니터링해야 합니까? 문서를 보면, vCPU를 고려해서 알림 기준을 세워야 한다고 나와 있습니다.

일반적으로, 사용 가능한 CPU의 90%로 임계값을 설정하는 것이 좋습니다. Redis는 단일 스레드이기 때문에 실제 임계값은 노드 총 용량의 일부로 계산해야 합니다. 2개의 코어가 있는 노드 유형을 사용하는 경우를 예로 들어보겠습니다. 이 경우 CPUUtilization의 임계값은 90/2 또는 45%입니다.

당시 인스턴스 타입이 cache.m5.large였기 때문에 vCPU는 2개입니다.
위 그래프에서 CPUUtilization이 15% -> 60% 올라가는 것을 봤다면, 실제로는 30% ~ 100%구나라고 인지했어야 한다는 말입니다.

Amazon ElastiCache for Redis 사용 설명서 > Redis 지표에서의 설명에도 vCPU 2개까지의 소규모 호스트에선 CPUUtilization으로 보는 것이 더 낫다고 하는군요.

Redis 엔진 스레드의 CPU 사용률을 제공합니다. Redis는 단일 스레드이므로 이 지표를 사용하여 Redis 프로세스 자체의 로드를 분석할 수 있습니다. EngineCPUUtilization 지표는 Redis 프로세스에 대한 보다 정확한 정보를 제공합니다. 이 지표를 CPUUtilization 지표와 함께 사용할 수 있습니다. CPUUtilization은 다른 운영 체제 및 관리 프로세스를 포함하여 전체적인 서버 인스턴스의 CPU 사용률을 표시합니다. 4개 이상의 vCPU를 포함하는 대규모 노드 유형에는 EngineCPUUtilization 지표를 사용하여 조정 임계값을 모니터링하고 설정하세요.

ElastiCache 호스트에서는 백그라운드 프로세스가 관리형 데이터베이스 환경을 제공하기 위해 호스트를 모니터링합니다. 이러한 백그라운드 프로세스는 CPU 워크로드의 상당 부분을 차지할 수 있습니다. vCPU가 2개 이상(2를 초과하는)인 대규모 호스트에서는 이 점이 중요하지 않습니다. 하지만 vCPU가 2개 이하인 소규모 호스트에 영향을 줄 수 있습니다. EngineCPUUtilization 지표만 모니터링하는 경우 호스트가 Redis의 높은 CPU 사용률과 백그라운드 모니터링 프로세스의 높은 CPU 사용률로 오버로드되는 상황을 인식하지 못합니다. 따라서 vCPU가 2개 이하인 호스트의 CPUUtilization 지표를 모니터링하는 것이 좋습니다.

이 내용은 Amazon ElastiCache for Redis 사용 설명서 > 문제 해결(Troubleshooting) 문서에서도 언급됩니다.

CPU 사용량: Redis는 다중 스레드 애플리케이션입니다. 그러나 각 명령의 실행은 단일(주) 스레드에서 발생합니다. 이러한 이유로 ElastiCache는 CPUUtilization 및 EngineCPUUtilization 지표를 제공합니다. EngineCPUUtilization은 Redis 프로세스 전용 CPU 사용률을 제공하고 CPUUtilization은 모든 vCPU에 대한 사용량을 제공합니다. 두 개 이상의 vCPU가 있는 노드는 대개 CPUUtilization 및 EngineCPUUtilization의 값이 서로 다르며, 일반적으로 두 번째 값이 더 큽니다.

여기서 일반적으로 두번째 값이 더 크다고 했는데, 두번째 Redis 서버 교체 당시의 지표를 다시 가져와 볼까요?

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

이때는 EngineCPUUtilization 지표가 계속 낮았습니다. 이 현상에 대해 AWS 측에 문의를 해봤는데,

CPUUtilization = Redis 사용 CPU(EngineCPUUtilization) + others (Redis 외 프로세스) 사용 CPU로 이해하면 될 듯합니다.
즉, 해당 시점에는 Redis 서비스보다 others 서비스(예를 들면, 스냅샷으로 생성 이후 스토리지 최적화를 위한 작업 ?)에 CPU가 쓰이고 있었다고 봐야 할 거 같습니다.
문서에서 일반적으로 EngineCPUUtilization이 높다는 것은 해당 서버가 Redis 용이니까 일반적으로 그렇다는 의미로 보입니다.

화면에서 보이는 CPUUtilization 지표의 피크는 35%이고 이때도 일시 연결 오류가 발생했습니다. 그렇다면 어느 시점에 위험하다고 판단해야 했을까요?

이 당시 서버는 cache.m5.xlarge(4vCPU)이기 때문에, CPUUtilization 지표의 임계값을 90/4 즉, 20% 선으로 설정하고 20%가 넘으면 위험하다고 판단했어야 했을지도 모릅니다. AWS 측의 답변도,

네 , CPUUtilization 을 기준으로 본다면 22.5 % 를 임계값으로 계산해 볼 수 있겠습니다. Redis 가 단일 Thread 로 처리되므로 단일 CPU Core 가 90% 이상 사용되지 않는 것을 임계값으로 보라는 의미로 이해됩니다.
단, 4vCPU 이상의 대규모 노드 유형에는 Redis 엔진 코어 대한 사용률을 보고하는 EngineCPUUtilization 지표를 사용할 수 있습니다. 현재 사용하시는 인스턴스 유형 상 EngineCPUUtilization 으로 CPU 부하상황을 판단하는 것이 맞을 것 같습니다.

4vCPU의 대규모 노드라서 완전한 설명이 되는 건 아니지만, 아래와 같이 분석해볼 수 있겠습니다.

  • 당시 redis 자체의 부하는 높지 않았다(EngineCPUUtilization 23%)
  • redis 이외의 프로세스에서 높은 CPU를 사용하고 있었고(22.5%를 초과) 부하의 원인이 되었다.

Amazon ElastiCache for Redis 사용 설명서 > 어떤 지표를 모니터링해야 합니까?에서 언급된 Redis 모니터링에 관한 글도 Redis 지표를 이해하는 데 많은 도움이 됩니다.

https://aws.amazon.com/ko/blogs/database/monitoring-best-practices-with-amazon-elasticache-for-redis-using-amazon-cloudwatch/

  • 여기서는 신규 커넥션이 늘어날수록 CPUUtilization 지표가 높아질 수 있다고 (가볍게) 언급이 되어있습니다.

신규 커넥션의 수 혹은 많은 커넥션 자체가 Redis 서버의 CPU 사용량을 늘리고, 이것이 장애로까지 이어졌을 거라 가정하고 개선 계획을 짜보았습니다.

개선 과정은 다음 글로 이어집니다.

“식은땀이 흐르는 Redis 서버 교체기 2편”으로 이동

PHP Annotated 이미지

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

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


안녕하세요!

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

News

PHP 8.2.0 RC 5 has been released

PHP 8.2.0 RC 5가 출시 되었습니다. 일정에 따라 또다른 릴리스 후보가 전달되었습니다. 여섯 번째 RC는 11월 10일에 예정되어 있으며 PHP 8.2의 최종 릴리스 이전의 마지막 RC가 될 것입니다.

PHP 8.2에 추가될 기능에 대한 자세한 목록은 PHP.Watch 또는 stitcher.io를 참조 하십시오.

또한 PHP 8.2 in 8 code blocks(8개의 코드 블럭으로 보는 PHP 8.2)에서 확인하고 싶을 수도 있습니다.

Martin Joo(@mmartin_joo)의 트윗

Me: “Hey Joe! What do you think about modern PHP?”
Joe:

What do you think about modern PHP 이미지

PHP 8.0.25 and PHP 8.1.12 have been released

PHP 8.0.25PHP 8.1.12가 출시되었습니다.

❗현재 지원되는 브랜치의 보안 릴리스입니다. 모든 사용자는 업그레이드하는 것이 좋습니다.
업데이트는 Phar 확장 및 쿠키 무결성의 취약점을 수정합니다. PHP.Watch의 이 블로그 게시물에서 자세히 알아볼 수 있습니다.

AWS X-Ray launches support for tracing PHP applications via OpenTelemetry in public preview.

AWS X-Ray는 public preview에서 OpenTelemetry를 통한 PHP 애플리케이션 추적 지원을 시작합니다.

The RedMonk Programming Language Rankings: June 2022

RedMonk 프로그래밍 언어 순위: 2022년 6월

mwop(@mwop)의 트윗

RedMonk는 PHP가 항상 top 5, 보통은 top 4에 올라온다는 사실에 대해 이야기하지 않습니다. 그들은 상위 3위 안에 드는 언어에 대해서만 이야기하거나 다른 “인기 있는” 언어가 목록에서 오르거나 내릴 때만 이야기합니다.

PHP Core

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

✅ RFC: json_validate #PHP 8.3

RFC: json_validate

Juan Carlos Morales json_validate()는 문자열에 유효한 JSON이 포함되어 있는지 확인하는 새로운 함수를 추가할 것을 제안했습니다. 문자열을 완전히 구문 분석할 필요가 없을 때 메모리를 절약하고 JSON인지 확인하기만 하면 됩니다.

var_dump(json_validate('{ "test": { "foo": "bar" } }'));  // bool(true)
var_dump(json_validate('{ "": "": "" } }')); // bool(false)

❌✅ RFC: Improve unserialize() error handling #PHP 8.3

unserialize()의 오류 핸들링 개선

Tim Düsterhus는 직렬화 해제(역직렬화)가 실패할 때 새로운 UnserializationFailedException을 던질 것을 제안했습니다.
이 RFC는 Twitter에서 엄청난 토론https://twitter.com/nicolasgrekas/status/1581023556707618818을 일으켰고 궁극적으로 새로운 예외 부분은 받아들여지지 않았습니다. 대신, 이제 발생한 오류의 심각도가 E_NOTICE에서 E_WARNING로 증가합니다.

📣 RFC: Randomizer Additions #PHP 8.3

\Random\Randomizer에 새로운 빌딩 블록 추가

Tim Düsterhus와 Joshua Rüsweg는 \Random\Randomizer에 새로운 “빌딩 블록” 방법을 추가할 것을 제안합니다. 이러한 방법은 장황하거나 사용자 영역에서 구현하기 매우 어려운, 일반적으로 유용한 작업을 구현합니다.

namespace Random; 
final class Randomizer {
// […]
public function getBytesFromAlphabet(string $alphabet, int $length): string {}
public function nextFloat(): float {}
public function getFloat(float $min, float $max): float {}
}

📣 RFC: Destructuring Coalesce #PHP 8.3

RFC: Destructuring Coalesce

Bob Weinand는 Destructuring 할당에서 기본값에 대한 연산자를 추가할 것을 제안합니다.

$input = 'key=value';
[$key, $val ?? 'default value'] = explode('=', $input, 2);

그건 그렇고, 현재는 기본값을 다음과 같이 배열에 추가할 수 있습니다.

[$key, $val] = explode('=', $input, 2) + [null, null]

팁 주셔서 감사합니다 , Sergii Shymko!

PHP_CLI_SERVER_WORKERS

Joe Watkins(@krakjoe)의 트윗

이건 비밀로 했어야 했는데, 문서화 되어서…
#PHP CLI 서버는 7.4부터 PHP_CLI_SERVER_WORKERS를 설정하면 여러 요청을 동시에 처리할 수 있습니다 …
다양하게 문제가 되긴 했었지만 개발용의 최신 PHP 버전에서는 괜찮을 수 있습니다.

Tools

dunglas/frankenphp

dunglas/frankenphp – Go로 작성되고 Caddy 웹 서버에 포함된 최신 PHP 앱 서버입니다.

Kevin Dunglas는 이 서버와 RoadRunner의 주요 차이점을 요약했습니다.

그의 reddit 답변은,

  • Roadrunner와 FrankenPHP는 접근 방식이 다릅니다.
  • Roadrunner는 php-cli를 실행하고 GRPC를 통해 웹 서버에 연결합니다. FrankenPHP는 임시 SAPI를 사용하며 Apache의 mod_php와 더 비슷하고 Go 코드는 PHP 인터프리터를 라이브러리로 사용하며 모두 동일한 프로세스에 있습니다.
  • RoadRunner에는 작업자 모드만 있으며 호환되는 앱에서만 작동할 수 있습니다. FrankenPHP에는 모든 기존 응용 프로그램과 호환되는 “표준” 모드와 일부 코드 변경(예: RR)이 필요한 작업자 모드가 있습니다.
  • RoadRunner는 PSR-7 HTTP 메시지를 사용합니다. FrankenPHP는 일반 슈퍼글로벌과 스트림(일반 모드와 작업자 모드 모두)을 사용하며 처리된 각 요청 후에 재설정됩니다.
  • RoadRunner는 전투 테스트를 거쳤고 프로덕션 준비가 되었습니다. FrankenPHP는 실험적이며 아직 프로덕션에 사용할 준비가 되지 않았습니다.
  • FrankenPHP는 또한 Go 라이브러리로 사용되어 PHP를 Go 프로그램이나 서버에 통합할 수 있습니다(이론적으로는 FrankenPHP를 Go로 작성된 Traefik 또는 로컬 Symfony 웹 서버에 통합할 수 있어야 합니다).

krakjoe/parallel

krakjoe/parallel – PHP 8+를 위한 간결한 병렬 동시성 API. 확장은 병렬 처리에 대한 Golang의 철학을 따릅니다. “메모리를 공유하여 통신하지 마십시오. 대신 통신을 통해 메모리를 공유하십시오.” – 채널, 이벤트 및 Future와 같은 필요한 모든 브릭을 제공합니다.

cachewerk/relay

cachewerk/relay – PhpRedis 및 Predis와 같은 Redis 클라이언트이지만 PHP 확장으로 작성되었기 때문에 훨씬 빠릅니다. 저자는 캐싱을 위한 Laravel, WordPress 및 Magento 연동 기능도 제공합니다.

GitHub 페이지에 들어가보면 벤치마크 결과도 빠르게 확인할 수 있게 제공합니다. 주의 사항은,

참고: 우리는 New Relic의 열렬한 팬이지만 APM 에이전트를 활성화하면 Relay 속도가 크게 느려지고 벤치마크가 왜곡됩니다.

PhpRedis 역시 PHP 확장(extension)인데,
Relay의 Documentation을 보면 APCu와 같은 shared in-memory cache라고 소개합니다. 모든 FPM worker 간 공유되는 PHP 메모리에 보관하기 때문에 더 빠르게 동작할 수 있습니다.

Saeghe

Saeghe – 최신 PHP 패키지 관리자입니다.

PHP에는 이제 패키지 관리자가 하나 더 있습니다! GitHub 링크를 종속성으로 사용합니다. 또한 PSR-autoloading에 의존하지 않고 대신 빌드 단계에 의존합니다(패키지를 추가한 후 별도의 빌드 단계를 거친다는 뜻).

경쟁은 언제나 옳다!

composer-unused/composer-unused

composer-unused/composer-unused – 코드를 스캔하여 사용되지 않은 composer 종속성을 드러내는 패키지입니다.

square/pjson

square/pjson – 이 라이브러리는 JSON을 사용자 정의 클래스의 실제 객체로 역직렬화하는 데 도움이 됩니다. 클래스 속성에 PHP 8의 attribute를 사용하여 수행합니다.

doctrine/collections 2.0.0

doctrine/collections 2.0.0 – 더 엄격한 유형과 기본 매개변수 및 반환 유형을 추가하는 주요 업데이트를 추가된 인기 있는 컬렉션 라이브러리입니다.

heiglandreas/holidayChecker

heiglandreas/holidayChecker – 이 패키지를 사용하면 주어진 날짜가 공휴일인지, 로케일을 인식하는지 확인할 수 있습니다.

Laragon

Laragon – 또 다른 로컬 개발 환경 도구 – XAMPP 및 유사 솔루션에 대한 이식 가능하고 격리된 빠르고 강력한 대안입니다. PHP.Watch의 이 게시물에서 자세히 알아보세요.

gacela-project/gacela

gacela-project/gacela – 이 패키지는 통합된 방식으로 프로젝트를 여러 모듈로 분할하여 모듈식 PHP 애플리케이션을 빌드하는 데 도움이 됩니다. Spryker 에서 크게 영감을 받았습니다.

Symfony

Symfony: translate Assert custom messages from entities

Thomas Dutrion의 Symfony: 엔터티의 사용자 지정 Assert 메시지 번역.

❗️ Twig security release

Fabien Potencier의 Twig 보안 릴리스: 파일 시스템 로더를 사용할 때 구성된 디렉토리 외부에서 템플릿을 로드할 가능성.

CQRS Principle with Symfony Messenger

Mert Simsek의 Symfony Messenger를 사용한 CQRS 원리.

emr-dev/sf-bug-bundle

emr-dev/sf-bug-bundle – Symfony 프로파일러 페이지를 공유하기 위한 패키지입니다. 작동 방식은 다음과 같습니다.

Emojis are new Symfony’s best friends!

Alexandre Daubois의 이모지는 새로운 Symfony의 절친입니다!.

New in Symfony 6.2

Javier Eguiluz의 Symfony 6.2의 새로운 기능: 내장(built-in) 캐시, 보안, 템플릿 및 Doctrine Attribute.

Laravel

What’s new in Laravel 10?

Benjamin Crozat의 Laravel 10의 새로운 기능은? – Laravel 10은 2023년 2월 7일에 출시됩니다. 개발은 여전히 진행 중입니다.

spatie/laravel-dynamic-servers

spatie/laravel-dynamic-servers – 서버를 동적으로 생성하고 제거하기 위한 패키지입니다. 사용 방법은 다음과 같습니다.

ryangjchandler/laravel-feature-flags

ryangjchandler/laravel-feature-flags – Laravel을 위한 독자적인 기능 플래그 패키지입니다. Laravel 프로젝트에 기능 플래그를 추가하는 방법을 배우세요.

creagia/laravel-sign-pad

creagia/laravel-sign-pad – 문서에 서명하고 Eloquent 모델과 관련된 인증된 PDF를 선택적으로 생성하기 위한 패키지입니다. 사용 방법은 다음과 같습니다.

hammerstonedev/sidecar

hammerstonedev/sidecar – Laravel 애플리케이션에서 AWS Lambda 기능을 배포하고 실행하는 도구입니다.

Laravel Vapor는 훌륭한 도구이지만, 가볍게 한 두개의 기능만 배포하고 싶을 때 이 패키지를 이용할 수 있습니다. 심지어 Python, Ruby, Java 등 타 언어를 배포할 수도 있습니다.

사이드카가 하지 않는 일

  • Sidecar는 API 게이트웨이, 데이터베이스, 캐시 등을 처리 하지 않습니다 . Sidecar가 관심을 갖는 유일한 것은 Lambda 함수를 패키징, 생성, 배포 및 실행하는 것입니다.
  • 사이드카는 HTTP를 통해 기능을 실행하는 방법을 제공하지 않습니다. 제공된 메소드를 통해 라라벨 앱에서 실행해야 합니다.
  • 다른 서비스가 필요한 경우 Vapor가 설정한 인스턴스를 사용하거나 직접 설정하는 것이 좋습니다.

Using jobs instead of commands in the schedule of a Laravel app

Freek Van der Herten의 Laravel 스케줄러에서 command 대신 job 사용.

Laravel’s safety mechanisms

Aaron Francis의 Laravel의 안전 메커니즘.

고통스러운 실수를 방지하는 데 도움이 될 수 있는 Laravel의 많은 안전 기능

  • N+1 prevention
  • Partially hydrated model protection
  • Attribute typos and renamed columns
  • Mass assignment protection
  • Model strictness
  • Polymorphic mapping enforcement
  • Long-running event monitoring

📺 Laravel Bootcamp: from start to finish

Brent Roose의 Laravel Bootcamp: 처음부터 마지막까지

📺 What’s new in Laravel 9.32.0

Christoph Rumpel의 Laravel 9.32.0의 새로운 기능.

📺 Laravel’s New Strict Mode (Everything You Need to Know)

Jeffrey Way의 Laravel의 새로운 Strict 모드(당신이 알아야 할 모든 것).

기타

Why I Don’t Enjoy Writing PHP Anymore

Michael Bodnarchuk의 내가 더 이상 PHP 작성을 즐기지 않는 이유 - 클릭을 유도하는 제목에도 불구하고 이 게시물은 PHP 버전의 이전 버전과의 호환성 중단에 대한 건설적인 우려를 제기합니다.

Composer의 저자 중 한 명인 Jordi는 일부 업그레이드 문제를 해결하는 데 도움이 될 수 있는 팁을 게시했습니다:

asgrim.rs(@asgrim)의 트윗

이 논의 후에 일부 사람들은 다음과 같이 보입니다.

  1. 시맨틱 버전 관리가 무엇을 의미하는지 이해하지 못함
  2. 공개 API에 대한 BC 중단이 무엇을 의미하는지 이해하지 못합니다. 특히 semver에 관해.
  3. PHP가 semver를 엄격히 따르지 않는다는 것을 깨닫지 못합니다.
    이것들을 이해하면 수긍이 될 겁니다.

위에 대한 답변으로, Jordi Boggiano(@seldaek)의 트윗

또한 안전을 위해 --ignore-platform-req=php+를 사용하십시오
더하기 기호를 사용하면 pkg에서 8.1이 필요한 경우 php 8.2를 사용할 수 있지만, php 8.0을 사용할 수 없습니다.

All the Easter Eggs in PHP

Ayesh Karunaratne의 PHP의 모든 이스터 에그.

phpinfo() 출력에는 4월 1일에만 볼 수 있는 특별한 PHP 로고가 있습니다.
Easter Eggs in PHP 이미지

Pragmatic development 3: Telegram bot

Vladimir Martsul의 실용적인 개발 3: Telegram 봇.

Loosely coupled Microservices in PHP

Dariusz Gafka의 PHP에서 느슨하게 결합된 마이크로 서비스.

Unpacked, named and positional arguments are in a call…

Damien Seguy의 함수 호출 시 압축된(unpacked) 인수, 명명된(named) 인수 및 고정된(positional) 인수.

세 가지 인수 전달 방식을 함께 사용하는 경우를 실험합니다.

Extrinsic sorting: A benchmark

Larry Garfield의 외부 정렬: 벤치마크 – 우선 순위, 그룹, 토폴로지 및 기타 사소하지 않은 정렬을 설명합니다.

Contract Tests

Kai Sassnowski의 계약(Contract) 테스트 – 인터페이스의 모든 구현에서 일관된 동작을 보장하기 위한 테스트 작성 지침.

PHP preload VS running as a daemon (RoadRunner)

PHP preload VS 데몬으로 실행(RoadRunner) – Pavel Murzakov의 벤치마크.

Supporting Legacy PHP project: painless switching to cloud storage

Vlad Reshetilo의 레거시 PHP 프로젝트 지원: 클라우드 스토리지로의 간편한 전환 – PHP의 기본 스트림 API를 사용하기 위한 깔끔한 트릭입니다.

How to build your next PHP project with a touch of AI

Benjamin Crozat의 AI로 다음 PHP 프로젝트를 빌드하는 방법.

Modern PHP features explained – PHP 8.0 and 8.1

최신 PHP 기능 설명 - PHP 8.0 및 8.1 – Steve McDougall

Using PHP enums as method calls

Thorsten Suckow-Homberg의 메소드 호출로 PHP 열거형을 사용 – 메소드 호출을 기존 유형 값에 동적으로 매핑 – 열거형의 깔끔하고 예상치
못한 사용법입니다.

Videos

Conferences

다음 PHP 모임이 언제인지 궁금하시다면 Tomas Votruba가 그의 멋진 friendsofphp.org 모임 수집 도구로 여러분을 안내해 드리겠습니다. php.net - 이벤트: 2022년 11월 캘린더도 있습니다 .

PHP Annotated 이미지

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

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


안녕하세요!

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

News

PHP 8.2 RC 3 has been released

PHP 8.2 RC 3이 출시되었습니다.
일정에 따라 또다른 RC가 출시되었습니다. 다음 RC 4는 10월 13일에 출시될 예정입니다.
PHP 8.2에 추가될 기능에 대한 자세한 목록은 PHP.Watch 또는 stitcher.io를 참조하십시오.

또한 플래시 뉴스레터인 The Road to PHP 8.2를 확인하십시오 .

PHP 7.4.32, PHP 8.0.24, and PHP 8.1.11 have been released

PHP 7.4.32, PHP 8.0.24PHP 8.1.11이 출시되었습니다.

❗️현재 지원되는 브랜치의 보안 릴리스입니다. 모든 사용자는 업그레이드하는 것이 좋습니다.

PhpStorm 2022.3 EAP Is Open!

PhpStorm 2022.3 EAP가 공개되었습니다!

다음은 PhpStorm용 Early Access Program의 일부로 이미 시도해볼 수 있습니다.

  • 새 UI에 대한 베타 액세스
  • 전체 PHP 8.2 지원
  • 빠른 수정 미리보기
  • 기타 등등

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Core Roundup 시리즈에서 자세히 다룹니다 . Roundup 시리즈의 여섯 번째 에피소드에서 PHP Core 팀의 모든 최신 개발 사항을 찾을 수 있으므로 간략하게만 언급하겠습니다.

📊 RFC: json_validate #PHP 8.3

RFC: json_validate

이 RFC에서 Juan Carlos Morales는 문자열에 유효한 JSON이 포함되어 있는지 확인하는 새 함수 json_validate()를 추가할 것을 제안합니다.

var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true

📣 RFC: Improve unserialize() error handling #PHP 8.3

RFC: unserialize() error handling 개선

Tim Düsterhus는 직렬화 해제가 실패할 때 throw되는 새로운 UnserializationFailedException 추가를 제안합니다.

try {    $result = unserialize($serialized);
var_dump($result);
} catch (\UnserializationFailureException $e) {
// unserialization failed
}

📣 RFC: StreamWrapper Support for glob() #PHP 8.3

RFC: glob()에 대한 StreamWrapper 지원

Timmy Almroth는 glob() 함수를 지원하는 StreamWrappers 구현을 제안합니다.

glob('vfs://*.ext')

☝️ RFC: Deprecations for PHP 8.3

RFC: Deprecations for PHP 8.3

PHP 8.3의 사용 중단(deprecation) 및 제거(removal)에 대해 고려해야 할 기능을 나열하는 포괄적인 RFC입니다.

  • Passing negative $widths to mb_strimwidth()
  • The NumberFormatter::TYPE_CURRENCY constant
  • MT_RAND_PHP
  • Global Mersenne Twister

Tools

play.phpsandbox.io

play.phpsandbox.io – 아무것도 설치하지 않고 브라우저에서 바로 Composer 패키지를 사용해 보세요. 훌륭하네요!

matthiasnoback/php-ast-inspector

matthiasnoback/php-ast-inspector – 추상 구문 트리를 위한 단계별 디버깅(step-debugger)을 지원하는 커맨드라인 도구입니다. 사용하는 방법.

kladskull/xEroS

kladskull/xEroS – 100% PHP로 작성된 비트코인과 유사한 블록체인. 교육용으로 좋습니다.

sfx101/deck

sfx101/deck – 클릭 한 번으로 Docker 기반 로컬 개발 환경을 가동할 수 있는 데스크탑 도구입니다.

cspray/annotated-container

cspray/annotated-container – PHP 8 Attribute를 사용해 자동 연결되고(autowired) 기능이 풍부한 PSR-11 호환 컨테이너를 만들기 위한 종속성 주입 프레임워크!

Spring Boot에서 영감을 받은 프로젝트라고 합니다.

<?php declare(strict_types=1);

namespace Acme\AnnotatedContainerDemo;

use Cspray\AnnotatedContainer\Attribute\Service;

#[Service]
interface BlobStorage {
public function store(string $key, string $contents) : void;
public function retrieve(string $key) : ?string;

}

#[Service]
class FilesystemBlobStorage implements BlobStorage {
public function store(string $key, string $contents) : void {
file_put_contents($key, $contents);
}
public function retrieve(string $key) : ?string {
return @file_get_contents($key) ?? null;
}
}

#[Service]
class BlobStorageConsumer {
public function __construct(public readonly BlobStorage $storage) {}
// Some API methods that would interact with the BlobStorage instance
}

phparkitect/arkitect

phparkitect/arkitect – 이 도구를 사용하면 PHP 코드베이스에 대한 아키텍처 제약 조건을 정의하여 CI에서 실행할 수 있습니다.

openai-php/client

openai-php/client – OpenAI API와 상호 작용할 수 있는 클라이언트입니다.

OpenAI의 GPT-3 API에 액세스하는 다른 방법이 필요한 경우 orhanerday/open-ai도 있습니다.

WordPress/wordpress-wasm

WordPress/wordpress-wasm – WebAssembly 마법 덕분에 브라우저에서 WordPress를 실행합니다..

nadrad/h-m-m

nadrad/h-m-m – Hackers Mind Map – 마인드 맵 작업을 위한 간단하고 빠른 키보드 중심 터미널 기반 도구입니다.

흥미로운 점은 이것이 말 그대로 종속성이 없는 단일 PHP 파일이라는 것입니다!

h-m-m screenshot

Symfony

Revisiting Lazy-Loading Proxies in PHP by Nicolas Grekas.

PHP의 Lazy-Loading Proxies 재방문 by Nicolas Grekas.

Symfony 의 유지 관리 정책과 ocramius/proxy-manager의 유지 관리 정책 사이의 비호환성 때문에 운영하는 포크(friendsofphp/proxy-manager-lts)는 최대한 수정을 자제하고 있었지만, 최근 두가지 trait를 추가하게 된 배경을 설명합니다.

Symfony ParamConverter: the best friend you don’t know yet by Thomas Bertrand.

Symfony ParamConverter: 아직 모르고 있지만 가장 친한 친구 by Thomas Bertrand.

Designing Symfony Validator the TDD way by Mike Zukowsky.

TDD 방식으로 Symfony Validator를 디자인하기 by Mike Zukowsky.

Solving the modern applications dilemma with Symfony UX by Titouan Galopin.

Symfony UX로 최신 애플리케이션 딜레마를 해결합니다 - by Titouan Galopin.

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

Symfony 콘솔 명령 출력 확인 by Andreas Möller.

CQRS with Symfony Messenger by Adrian Garay.

Symfony Messenger를 사용한 CQRS by Adrian Garay.

StenopePHP/Stenope

StenopePHP/Stenope – Symfony용 정적 웹사이트 구축 도구. 본격적인 Symfony 앱을 만든 다음 원하는 위치에 정적 페이지로 배포할 수 있습니다.

phpsword/sword-bundle

phpsword/sword-bundle – Symfony를 사용한 최신 WordPress 개발. roots/bedrock과 같은 추가 기능이 있는 WordPress 대신 Sword는 WordPress를 포함하는 Symfony 프레임워크입니다. Sword란 무엇입니까?에서 자세히 알아보십시오.

Laravel

👨‍🏫 Laracon Online

Laracon Online - Laravel 커뮤니티의 모든 대화는 YouTube에서 볼 수 있습니다. 무엇보다도 Celeb Porzio는 Livewire의 미래를 발표했고 Taylor Otwell은 Laravel 팀의 새로운 학습 사이트인 Laravel Bootcamp를 발표했습니다.

📺 What’s new in Laravel 9.31.0

What’s new in Laravel 9.31.0 – Christoph Rumpel의 간결한 비디오 overview.

Working with OS process in PHP by Steve (King) McDougall.

PHP에서 OS 프로세스 작업 by Steve (King) McDougall.

Drawbacks behind Laravel Facades by Grzegorz Korba.

Laravel Facade 이면의 단점 by Grzegorz Korba.

A Deep Dive Into Laravel Queues by Farhan Hasin Chowdhury.

Laravel 대기열(Queue)에 대한 심층 분석 by Grzegorz Korba.

Laravel의 Job, Queue, Worker에 대한 완전한 가이드.

Sammyjo20/laravel-haystack

Sammyjo20/laravel-haystack – 매우 간단하지만 강력한 데이터베이스 기반 작업 체인입니다.

dietercoopman/mailspfchecker

Dietercoopman/mailspfchecker – 주어진 이메일 주소를 대신하여 주어진 메일 서버를 통해 이메일을 보낼 수 있는지 확인하는 패키지 - 사용법.

ksassnowski/venture 4.0.0

ksassnowski/venture 4.0.0 – Laravel 앱에서 복잡한 비동기 워크플로를 만들고 관리하기 위한 패키지입니다.

YorCreative/Laravel-Scrubber

YorCreative/Laravel-Scrubber – 운영 보안 정책을 위반하는 민감한 정보가 개발자에 의해 실수로 또는 다른 방식으로 누출되는 것을 방지하는 패키지입니다. - 사용법.

hotmeteor/receiver

hotmeteor/receiver – Laravel용 드롭인 웹훅 처리 라이브러리입니다.

dedoc/scramble

dedoc/scramble – Laravel용 자동 OpenAPI 문서 생성기. PHPDoc 주석이 필요하지 않습니다.

findapr.io

findapr.io – 기여할 오픈 소스 Laravel 및 PHP 프로젝트를 찾는 데 도움이 되는 사이트입니다.

Other Frameworks

spiral/framework v3.0.0

spiral/framework v3.0.0 - RoadRunner 제작자의 프레임워크 주요 업데이트.

PHP 8.1이 필요하며 새로운 필터 및 유효성 검사, 작업 직렬화, 오류 핸들러, 대기열 및 콘솔 인터셉터, 이벤트 디스패처(PSR-14), 주입 가능한 열거형, 더 유연한 라우터, 최적화된 부트로더 및 더 나은 성능을 제공합니다.

Phalcon PHP Framework reached its major 5.0 release.

Phalcon PHP 프레임워크가 major 5.0 릴리스에 도달했습니다.
Phalcon은 PHP 확장으로 제공되기 때문에 독특한 프레임워크입니다. 그러나 로드맵에 따르면 팀은 기존 모델로 전환하기로 결정했으며 다음 주요 릴리스는 PHP 패키지로 계획하고 있습니다.
5.0의 새로운 기능에 대한 자세한 목록은 업그레이드 페이지를 확인하십시오.

api-platform/api-platform 3.0

api-platform/api-platform 3.0 – Symfony를 기반으로 구축된 이 성숙한 프레임워크를 통해 REST 및 GraphQL API 등을 생성할 수 있습니다.

Appwrite 1.0

Appwrite 1.0 – 최신 웹 또는 모바일 애플리케이션을 구축하는 데 필요한 API를 제공하는 오픈 소스 서비스로서의 백엔드 솔루션의 주요 안정적인 릴리스입니다.

작년에 Appwrite는 nginx+php-fpm에서 Swoole로 마이그레이션 하여 91%의 성능 향상을 경험했습니다.

James Brooks(@jbrooksuk) 트윗

어떤 프레임워크가 가장 좋은지 논하기에는 인생이 너무 짧습니다.
자신에게 좋은 것을 사용하고 계속 진행하십시오. 👍🏻

기타

Asymmetric visions by Brent Roose.

Brent Roose의 비대칭 비전.

비대칭 가시성(Asymmetric Visibility) RFC는 좋은 RFC이고 유연하고 Readonly properties을 완전히 대체합니다.
Brent가 우려하는 건 RFC 자체의 문제가 아니라 이 RFC가 readonly property를 완전히 대체하면서, readonly property가 사라질지 모르는 두려움이라고 합니다. 겨우 1년 전에 추가된 기능의 존속 여부가 불안해지는 것에 대한 우려이죠. 게다가 이미 작년에 Nikita의 유사한 아이디어에 관해 많은 논의를 했었고, readonly property가 use case의 90%는 커버할 수 있고 이 정도면 충분다고 결론이 났다고 합니다. 비대칭 가시성은 2년 전 readonly property에 관해 많은 논의를 했을 때 결정했어야 할 문제라고 생각한다고 합니다.

이 글의 마지막에는 readonly가 해결하지 못하는 문제를 연구가 이루어지고 있다고 그 예시를 소개하기도 합니다.

Increase code coverage successively by Andreas Heigl.

Andreas Heigl의 코드 coverage 범위를 연속적으로 늘리십시오.

phpcov를 이용해 새로 기여한 코드에 대한 테스트를 포함하도록 강제하는 방법을 소개합니다.

Testing Randomness of PHP Random Number Functions by Ayesh Karunaratne.

Ayesh Karunaratne의 PHP 난수 함수의 무작위성 테스트.

운영 체제나 프로그래밍 언어 런타임은 다양한 알고리즘을 사용하여 난수를 생성합니다. 동전 던지기처럼 실생활에서 볼 수 있는 진짜 난수 생성기에 비해 이런 의사(Pseudo) RNG(난수생성기, Random Number Generator)는 초기 “시드” 값에 의존하고 초기 시드 값과 알고리즘을 아는 것만으로도 난수의 전체 스트림을 예측하기에 충분합니다.

이 글에서 PHP 8.2 이후 제공되는 난수 생성기의 무작위성을 측정하기 위해 GD 확장을 사용해 임의의 X 및 Y 좌표에 단일 픽셀을 배치하여 이미지를 그립니다.
미리 결정된 시도 횟수에서 대부분 픽셀 분포가 균일한 이미지는 “진정한” RNG에 가까운 난수 생성기를 나타냅니다. 순수하게 시드 값을 기반으로 하는 값을 생성하는 RNG(예: Mersenne Twister)는 시드가 동일하게 유지되는 경우 동일한 출력을 생성해야 합니다.

다양한 RNG를 소개하고 실험하지만 마지막에는 random_int/random_bytes를 추천하네요.

모든 난수 생성 목적에 대해 random_int 및 random_bytes 함수를 사용하는 것은, 예외로 실패하기도 하고(안전하지 않은 알고리즘을 자동으로 기본값으로 설정하는 대신) PHP 7.0 이후의 모든 PHP 버전에서 지원되기 때문에 권장됩니다.

Granular interfaces by Sebastian De Deyne.

Sebastian De Deyne의 세분화된 인터페이스.

SOLID의 I에 관한 글.

Adding the last types to PHP code by Damien Seguy.

Damien Seguy의 PHP 코드에 마지막 유형 추가하기.

99.9% 타이핑을 향한 여정은 예상보다 길었고 몇 가지 가벼운 함정이 나타났습니다.

  • 보이지 않는 유형
  • 이전보다 더 많은 캐스팅
  • 기본값 처리
  • 임시값 관리
  • resource와의 씨름
  • 캐시 메커니즘으로 저글링

The three nothings of PHP by Damien Seguy explaining the difference between null, void, and uninitialized.

Damien Seguy의 PHP의 세 가지 빈 값(nothing) : null, void, uninitialized의 차이점을 설명.

Is it a DTO or a Value Object? by Matthias Noback.

그건 DTO입니까? Value Object입니까? by Matthias Noback.

Matthias Noback의 기준

  • DTO
    • 원시 데이터(문자열, 부울, 부동 소수점, null, 이러한 것들의 배열)를 보유하는 객체
    • 비즈니스 관점에서 실제로 의미가 있다고 보장하지 않음
    • 값의 정확성에 대한 보증을 제공하지 않음 : 문자열은 비어 있을 수 있고, 정수는 음수일 수 있습니다
    • DTO는 데이터가 애플리케이션에 들어가는 위치와 애플리케이션을 나가는 위치의 두 곳에서만 사용해야 합니다
  • Value Object
    • 하나 이상의 값 또는 값 객체를 래핑 하는 객체
    • 도메인 관점에서 의미가 있음을 보장
    • 값의 정확성에 대한 증거를 제공 : 문자열은 더 이상 비어 있지 않으며 숫자가 올바른 범위에 있는지 확인됩니다
    • 값 객체는 값이 우리의 기대와 일치하는지 확인하고 다시 확인하고 싶지 않은 모든 위치에 사용됩니다

참고 : ValueObject by Martin Fowler

Can we consider DateTimeImmutable a primitive type?

DateTimeImmutable을 원시(primitive) type으로 고려할 수 있습니까?

Matthias Noback은 “그렇지 않다”고 결론지었습니다. Andreas Möller는 더 나아가 자신의 Enhancing types 블로그 게시물에서 그건 단순한(simple) type이라고 제안합니다.

바로 위 Matthias Noback의 글에서 DTO가 오직 원시(primitive) type의 값만 보유한다고 했는데, 그렇다면 DateTimeImmutable도 원시 type으로 분류할 수 있는지 고찰하는 글입니다.

이어 소개된 Andreas Möller의 글에서는 “정교한(sophisticated) 원시 type” 혹은 “단순한(simple) type”으로 부를 수 있을 것이라고 이야기 합니다. Ted M. Young은 이를 비제약 type이라고 표현하며 원시 type에 대한 집착을 버려라는 발표(Stop Obsessing About Primitives])를 하기도 했습니다.
글 마지막에 소개된 것처럼 원시 type에 집착하지 않고, 더 적절한 type을 찾아갈 필요가 있습니다.

Named arguments by Sebastian De Deyne.

Sebastian De Deyne의 명명된 인수(Named arguments).

How PHP engine builds AST by Anton Sukhachev.

PHP 엔진이 AST 를 구축하는 방법 by Anton Sukhachev.

Pholyglot (PHP to PHP+C polyglot transpiler)

Pholyglot (PHP에서 PHP+C로의 다중 언어 번역기) – PHP의 하위 집합을 입력으로 사용하고 PHP와 C 모두에서 실행할 수 있는 다중 언어 코드를 출력하는 작은 취미 프로젝트 변환기입니다.

Plotting the memory of a PHP process with Gnuplot by Grégoire Paris.

Gnuplot로 PHP 프로세스의 메모리를 플로팅하기 by Grégoire Paris.

Gnuplot는 “a portable command-line driven graphing utility”라고 합니다.

Say hello to TLDR

Marcel Pociot(@marcelpociot)의 트윗

특정 코드 조각이 무엇을 하는지 궁금해 한 적이 있습니까?

TLDR plugin을 확인해보세요.

TLDR 이미지

Video

📺 PHP For Beginners

초심자를 위한 PHP – 누군가가 “2022년에 PHP를 어떻게 배우나요?”라고 묻는다면 Jeffrey Way의 이 과정이 답입니다.

📺 PHP in 1 minute by Brent Roose.

1분 동안 살펴보는 모던 PHP by Brent Roose.

PHP is not dead.

📺 PHP is breaking my code! by Brent Roose.

PHP가 내 코드를 깨고 있습니다! by Brent Roose.

동적 속성은 PHP 8.2에서 더 이상 사용되지 않으며 커뮤니티는 이에 대해 분열되어 있습니다.

📺 Pest From Scratch with Luke Downing.

처음부터 따라하는 Pest with Luke Downing.

Conferences

대면 이벤트가 한창입니다. 다음의 대규모 PHP 행사를 확인하세요.

다음 PHP 밋업이 언제인지 궁금 하시다면? – Tomas Votruba는 그의 사랑스러운 friendsofphp.org 모임 수집기로 여러분을 안내합니다.

PHP Annotated 이미지

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

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


안녕하세요!

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

News

PHP 8.2 Beta 3 has been released

PHP 8.2 베타 3가 출시되었습니다.

최종 베타가 예정대로 출시되었습니다. 다음 릴리스는 PHP 8.2.0 RC 1이며 9월 1일에 릴리스될 예정입니다.

PHP 8.2에서 더 이상 사용되지 않는 동적 속성(property)을 처리하는 방법을 확인하십시오 .

PHP 8.2에 추가될 기능에 대한 자세한 목록은 PHP.Watch 또는 stitcher.io를 참조하십시오 .

또한 플래시 뉴스레터인 The Road to PHP 8.2를 확인하십시오 .

PHP 8.0.22 and PHP 8.1.9 have been released

PHP 8.0.22PHP 8.1.9가 릴리스되었습니다.

🪲현재 지원되는 브랜치에 대한 버그 수정 릴리스입니다.

PHP Foundation Update, July 2022

PHP 재단 업데이트, 2022년 7월

후원자를 위한 월간 업데이트를 확인하십시오.

Composer 2.4 is out

Composer 2.4가 출시 되었습니다.

종속성의 보안 상태를 추적(audit), bash 자동 완성 및 여러 작은 변경 사항이 추가됐습니다.

두 가지 새로운 명령에 대해 자세히 알아보세요: auditbump.

deployphp/deployer 7.0.0 is out

deployphp/deployer 7.0.0이 출시되었습니다.

Deployer는 널리 사용되는 프레임워크를 지원하는 PHP로 작성된 배포 도구입니다.

v.7의 가장 큰 변화 중 하나는 새로운 공급 레시피입니다. 프로비저닝 레시피는 PHP 애플리케이션을 실행하기 위한 모든 VPS를 자동으로 설치하고 구성할 수 있습니다. 웹 서버, SSL, PHP, Redis, 노드 등을 설치합니다.

Codeception/Codeception 5.0.0 is out

Codeception/Codeception 5.0.0이 출시되었습니다.

Attribute, PHP 8 지원, 샤딩 및 기타 기능이 추가되었습니다!

swoole/swoole-src 5.0.0 is out

swoole/swoole-src 5.0.0이 출시되었습니다.

동시성 확장의 새 버전은 향상된 타입 시스템, 모든 함수의 매개변수 및 반환 값에 대한 타입 추가, 최적화된 오류 처리 및 기타 개선 사항 및 추가 사항과 함께 제공됩니다.

PhpStorm 2022.2 released

PhpStorm 2022.2 출시

이 주요 업데이트는 Mockery 및 Rector 지원, 제네릭 및 열거형 지원 강화, 디버거 및 HTTP 클라이언트 개선 등을 제공합니다.

🎬 PhpStorm 2022.2의 새로운 기능에 대한 비디오 개요를 시청 하세요.

그리고 막 PhpStorm 2022.3 로드맵이 게시했습니다.

  • PHP 8.2
  • Code Vision for PHP
  • Quick-fix preview
  • ParaTest support

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Core Roundup 시리즈에서 자세히 다룹니다 . 이 시리즈의 다섯 번째 에피소드가 곧 출시될 예정이므로 간략하게만 언급하겠습니다.

RFC: Asymmetric Visibility #PHP 8.3

https://wiki.php.net/rfc/asymmetric-visibility

이전에 Nikita Popov는 C#과 같은 속성(property) 접근자 구현을 제안했습니다. 그 RFC는 토론 단계를 통과하지 못했습니다. 대신 읽기 전용 속성이 승인되었습니다.

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

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

Larry의 몇 가지 메모:

  • 읽기 전용 속성의 복제 가능성 문제를 해결합니다.
  • 읽기 전용 속성의 상속 문제을 수정합니다. 지금은 readonly는 private 범위에서만 설정할 수 있고 protected 범위에서는 설정할 수 없습니다.
  • 다른 속성으로부터 재생성된 속성에 유용할 것입니다. 예를 들어, $o->setFirstName() 혹은 $o->setLastName()이 호출될 때마다 내부적으로 업데이트되는 public private(set) $fullName. 이는 향후 로드맵에 있는 접근자 hook에 적용될 수 있습니다.

Tools

serversideup/docker-php

serversideup/docker-php – PHP용 프로덕션에 바로 사용 가능한 도커 이미지. Laravel, WordPress 등에 최적화되었습니다.

Crell/Serde

Crell/Serde – PHP 8용 강력한 Serde(직렬화/역직렬화) 라이브러리입니다. 자세한 내용은 Larry Garfield의 소개 게시물을 참조 하세요.

statix-php/server

statix-php/server – PHP의 내장 서버를 둘러싼 객체 지향 래퍼입니다.

aimeos/map

aimeos/map – PHP 배열 및 컬렉션이 쉬워졌습니다. 또 다른 Laravel과 유사한 컬렉션 패키지이지만 종속성이 없습니다.

hotmeteor/spectator

hotmeteor/spectator – PHP용 OpenAPI 테스트.

DaveLiddament/sarb

DaveLiddament/sarb – 이 도구는 PHP 정적 분석기에 대한 기준점(baseline) 기능을 제공합니다(기준점 이후에 발생한 문제만 리포트).
v1.5.0에서는 –clean-up옵션을 제공합니다. 여기에는 코드 품질을 점진적으로 개선하기 위해 수정해야 할 5가지 임의 문제가 나열되어 있습니다.

leafsphp/leaf

leafsphp/leaf – 웹 앱과 API를 빠르게 생성하기 위한 간단하지만 강력한 마이크로 프레임워크입니다.

pheature-flags/pheature-flags

pheature-flags/pheature-flags – 제어된 조건에서 특정 기능을 활성화 및 비활성화할 수 있는 릴리스 관리 시스템입니다.

gakowalski/alternative-interpreters

gakowalski/alternative-interpreters – 대체 PHP 인터프리터, 컴파일러 및 트랜스파일러 목록입니다.

Symfony

symfony/clock

symfony/clock은 시스템 시계(clock)에서 응용 프로그램을 분리하는 새로운 컴포넌트입니다.

그것의 릴리스는 프레임워크 제국주의(무료로 어떤 것을 취한 다음 자기 것이라고 우기는 현상)에 대해 Symfony를 비난하는 짧은 트윗 폭풍을 일으켰습니다.

Frank de Jonge(@frankdejonge)의 트윗

솔직히, @symfony 가 커뮤니티 패키지를 수용하는 대신 시계를 만드는 것은 나를 슬프게 만듭니다. 그들은 NIH 증후군으로 계속 고통 받고 있습니다. 말 그대로 3(?) 시계 패키지와 동일한 인터페이스입니다. Symfony는 아마도 그들의 인기가 떨어지게 할 것입니다.

참고 : NIH 증후군(Not invented here syndrome)은 말 그대로 ‘여기서 개발한 것이 아니다.’(Not invented here)라는 의미로, 제3자가 개발한 기술이나 연구 성과는 인정하지 않는 배타적 조직 문화 또는 그러한 태도를 말한다. - 위키백과

taylor otwell(@taylorotwell)의 트윗

Symfony가 왜 그렇게 하는지 전혀 읽지 않았지만 난 여기에 돈을 걸 것입니다. 1) 그건 사소합니다. 2) They don’t want to have to bug an outside rando with a day job and 1,000 other concerns to update PHP versions, fix bugs, etc. anytime something comes up.(역자 주: 해석 포기)

Nicolas Grekas(@nicolasgrekas)의 트윗

  • Nicolas는 Symfony OSS core contributor입니다.

Package Principles는 읽을 가치가 있을 것입니다. 예를 들어 Stable-Dependencies Principle이 새로운 #Symfony Clock 구성 요소에 대한 논의에 한 눈에 적용해볼 수 있습니다.

Package Principles에서 이야기 하는 Stable-Dependencies Principle

  • 디자인은 사용되는 환경의 특성에 따라 변화하고 있습니다. 따라서 패키지 디자인도 변화를 지원해야 합니다. SDP는 휘발성을 원하는 패키지가 변경하기 어려운 패키지에 의존해서는 안 된다고 명시하고 있습니다.

8 News in Config Transformer that Converts Symfony YML to PHP by Tomas Votruba.

Symfony YML을 PHP 로 변환하는 Config Transformer의 8가지 소식 by Tomas Votruba

Repository pattern the SOLID way in Symfony by Saeid Raei.

Symfony에서 SOLID하게 리포지토리 패턴 구현하는 법 by Saeid Raei.

How to apply Hexagonal/Clean/Onion architecture with only two changes to your symfony project by Saeid Raei.

symfony 프로젝트에 단 두 가지 변경 사항으로 Hexagonal/Clean/Onion 아키텍처를 적용하는 방법 by Saeid Raei.

Symfony Testing: using Repository pattern without connecting to database by Saeid Raei.

Symfony 테스트: 데이터베이스에 연결하지 않고 Repository 패턴을 사용 by Saeid Raei.

Voila! Symfony and PHP 8.1 by Mert Simsek.

짜잔! Symfony와 PHP 8.1 by Mert Simsek.

Decorating Commands by Michael Zangerle.

Decorating Commands by Michael Zangerle.

두 가지 목적에 따라 다르게 동작하길 바라는 Command를 데코레이터 패턴으로 변경.

Clean up your migrations! by Victor Bocharsky.

마이그레이션을 정리하십시오! by Victor Bocharsky.

Laravel

🎬 What’s New In Laravel 9.23.0, Laravel 9.24.0, Laravel 9.25.0

🎬 Laravel 9.23.0, Laravel 9.24.0, Laravel 9.25.0의 새로운 기능 - Christoph Rumpel이 Laravel 업데이트에 대한 간략한 개요를 제공하는 이 새로운 YouTube 시리즈를 확인하세요.

protonemedia/laravel-splade

protonemedia/laravel-spade – Blade의 단순성과 Inertia.js의 마법.

SPA를 쉽게 구축할 수 있게 도와줍니다.

Sairahcaz/laravel-xhprof

Sairahcaz/laravel-xhprof – Laravel 애플리케이션을 프로파일링하기 위한 간편한 XHProf 설정.

BinarCode/laravel-restify

BinarCode/laravel-restify – 강력한 JSON:API 호환 Rest API를 Laravel과 함께 만드는 가장 빠른 방법입니다.

Increase performance by using Eloquent’s setRelation method by Freek Van der Herten.

Eloquent의 setRelation 메소드를 사용하여 성능을 높이십시오 by Freek Van der Herten.

How I develop applications with Laravel by Steve (King) McDougall.

Laravel로 애플리케이션을 개발하는 방법 by Steve (King) McDougall.

Scaling Laravel to 100M+ jobs and 30,000 requests/sec by Mateus Guimarães.

Laravel을 1억 개 이상의 작업과 초당 30,000개의 요청으로 확장합니다 by Mateus Guimarães.

How to Safely and Efficiently Upgrade an Out-of-Date Laravel App by Jamison Valenta

오래된 Laravel 앱을 안전하고 효율적으로 업그레이드하는 방법 by Jamison Valenta

Challenges when lift-and-shifting Laravel apps into AWS Lambda by Marco Deleu.

Laravel 앱을 AWS Lambda로 리프트 앤 시프팅할 때의 문제 by Marco Deleu.

🎬 5-hour Laravel 9 tutorial for beginners.

🎬 초보자를 위한 5시간짜리 Laravel 9 튜토리얼.

기타

Serverless PHP Applications on Digital Ocean Functions by Ayesh Karunaratne.

Digital Ocean Functions에서의 서버리스 PHP 애플리케이션 by Ayesh Karunaratne.

Narrowing types for static analysis by Jordi Boggiano

Jordi Boggiano의 정적 분석 을 위한 타입 좁히기 – Composer를 비롯한 몇 가지 오래된 코드베이스를 PHPStan의 레벨 8로 이동하는 과정에서 Jordi가 배운 몇 가지 교훈.

The PHP Handbook – Learn PHP for Beginners by Flavio Copes.

PHP 핸드북 – Flavio Copes의 초심자를 위한 PHP 배우기.

The difference between Traits, Interfaces, and Abstract Classes in PHP by Andrew Schmelyun.

Andrew Schmelyun의 PHP에서 Trait, 인터페이스 및 추상 클래스의 차이점.

When to use a trait? by Matthias Noback.

Trait는 언제 사용합니까? by Matthias Noback.

Stop using “static” in PHP and Stop using “extends” in PHP by Mike Zukowsky.

Mike Zukowsky의 PHP에서 “static”을 사용하지 맙시다PHP에서 “extends”를 사용하지 맙시다.

The 100 PHP functions in 2022 by Damien Seguy.

Damien Seguy의 2022년 가장 많이 사용되는 PHP 함수 100개.

PHP native Attributes quick reference by Damien Seguy – How many core attributes can you name?

Damien Seguy의 PHP 기본(native) Attribute 빠르게 확인하기 – 여러분은 몇 가지나 이름을 댈 수 있습니까?

Simple Solutions 1 – Active Record versus Data Mapper by Matthias Noback.

간단한 솔루션 1 – Active Record vs Data Mapper by Matthias Noback.

3 years of lift-and-shift into AWS Lambda by Marco Aurélio Deleu

AWS Lambda로 리프트 앤 시프트한 3년 – AWS Lambda를 PHP 호스팅 공급자로 사용할 때 주의해야 할 주의 사항.

(위 Laravel 쪽에서 소개된 글과 동일합니다)

Do generators really reduce the memory usage?

generator가 실제로 메모리 사용량을 줄입니까?

What I would change about PHP by Brent Roose.

Brent Roose의 내가 PHP에서 바꾸고 싶은 것.

Audio/Video

🎬 Why you need to update PHP by Brent Roose.

Brent Roose의 PHP를 업데이트해야 하는 이유.

🎬 PHP 101 for Absolute Beginners – A full 2-hour course.

완전 초보자를 위한 PHP 101 – 전체 2시간 코스.

Conferences

대면 이벤트가 드디어 돌아왔습니다!

Community

A nomenclature of hate by Jordi Boggiano.

Jordi Boggiano의 증오 명명법.

오픈 소스 프로젝트를 유지하는 것은 어렵습니다. 문제를 해결해야 할 뿐만 아니라 좌절한 사용자를 다루어야 하기 때문입니다. Alexander Makarov가 수집한 몇 가지 예를 확인하십시오: samdark/opensource-hate.

swyx(@swyx)의 트윗

https://twitter.com/swyx/status/1552730861052628992

swyx의 트윗 이미지

asgrim/side-effect

asgrim/side-effect - 모든 걸 __toString() 메서드 안에서 처리하는 프레임워크.

James Titcumb(@asgrim)의 트윗

농담인 줄 알았겠지만, 진짜 만들었어

누군가 __toString() 이외의 다른 메서드에 구현되었다며 버그 리포팅해서, 이를 수정하기도 했습니다.

PHP Annotated 이미지

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

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


안녕하세요!

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

News

PHP 8.2.0 Alpha 2 and PHP 8.2.0 Alpha 3 have been released

세 번째이자 마지막 알파가 예정대로 출시되었습니다. 다음 릴리스는 7월 21일에 예정된 PHP 8.2.0 Beta 1입니다.

역자 주: 번역 시간 기준으로 21일이 지나 8.2.0 Beta 1은 출시되었습니다. 다음 릴리스는 8월 4일에 예정된 PHP 8.2.0 Beta 2입니다.

PHP 8.2에 추가될 기능에 대한 자세한 목록은 php.watch 또는 stitcher.io를 참조하십시오 .

PHP 8.0.21 and PHP 8.1.8 have been released

PHP Foundation Update, June 2022

PHP Foundation 업데이트, 2022년 6월

후원자를 위한 월간 업데이트를 확인하십시오.

  • 개발자가 달성한 것, 새로운 후원자 및 재단에 기여할 수 있는 재정적 방법 등

php.net redesign is being discussed

php.net 재설계가 논의 중입니다

개발 중인 php 웹사이트 캡쳐 화면

디자인 실험으로 현재 #php 웹사이트를 개편했습니다. 더 수정할 수 있는 부분이 많이 있지만 지금까지는 만족합니다. 어떻게 생각하세요?

Mike van Riel(@mvriel)의 트윗

한편 Andreas Möller 덕분에 php.net 소스 코드는 이제 friendsofphp/php-cs-fixer를 사용하여 코딩 표준 문제를 수정 합니다.

PHP의 메인 사이트 업데이트를 돕고 싶다면 기여 가이드(contributing guide)를 확인하세요 .

인기 있는 PHP 비동기 프레임워크 ReactPHP 10

10주년을 기념하기 위해 팀은 async 및 await 기능이 포함된 완전히 새로운 비동기 구성 요소인 reactphp/async를 출시했으며 이는 PHP 8.1+와 같은 fiber를 기반으로 구축되었습니다.

Cees-Jan Kiewiet의 My road to fibers with ReactPHP를 읽어보세요.

Is PHP dead?

PHP는 죽었습니까?

한 번 그리고 영원히 대답을 남겼습니다.

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Core Roundup 시리즈에서 자세히 다룹니다 . 이 시리즈의 다음 에피소드가 곧 출시될 예정이므로 업데이트에 대해 간단히 언급하겠습니다.

✅ RFC: Disjunctive Normal Form Types #PHP 8.2

RFC: Disjunctive Normal Form Types #PHP 8.2

Disjunctive Normal Form 유형에 대한 지원이 PHP 8.2에 승인되었습니다. 결합 및 교차 유형을 혼합할 수 있습니다.

class Foo {  
public function bar(): (A & B) | D;
}

Derick Rethan가 George Peter Banyard와 함께 하는 🔈 PHP Internals News 팟캐스트 에피소드 103에서 자세히 알아보십시오.

✅ RFC: Fetch properties of enums in const expressions #PHP 8.2

RFC: const 표현식에서 enum 속성 가져오기 #PHP 8.2

PHP 8.2에서는 -> / ?-> 를 사용하여 상수 표현식에서 enum 속성을 가져올 수 있습니다.

enum A: string {
case B = 'B';
const C = [self::B->value => self::B];
}

✅ RFC: Random Extension Improvement #PHP 8.2

RFC: 랜덤 확장 개선 #PHP 8.2

몇 가지 문제가 “Random Extension 5.x” RFC의 투표가 시작된 이후에만 제기 되었습니다(적절한 토론이 부족했기 때문에). 이러한 각 문제에 대해 투표 옵션을 만들고 추가 결정을 내리기로 했고 모두 통과했습니다.

✅ RFC: Make the iterator_*() family accept all iterables #PHP 8.2.

RFC: iterator_*() 패밀리가 모든 이터러블 #PHP 8.2를 허용하도록 합니다.

PHP 8.2에서 iterator_to_array()와 iterator_count()의 $iterator 파라미터는 \Traversable에서 iterable(예: \Traversable|array)로 확장됩니다.

function foo(iterable $foo) {
$foo = iterator_to_array($foo); //now accepts arrays

return array_map(strlen(...), $foo);
}

✅ RFC: Constants in Traits #PHP 8.2

RFC: Trait에서의 상수 #PHP 8.2

PHP 8.2에서는 현재 property에서 가능한 것과 동일한 방식으로 Trait에 상수를 정의할 수 있습니다.

trait Foo {
public const PHP_VERSION = '8.2';
}

class Base {
use Foo;
}

class Bar extends Base {
public function phpVersion(): void {
echo parent::PHP_VERSION; // 8.2
}
}

❌ RFC: New Curl URL API

RFC: 새로운 Curl URL API

❌ RFC: json_encode indentation

RFC: json_encode 들여쓰기

❌ RFC: Stricter implicit boolean coercions

RFC: 더 엄격한 암시적 bool 강제 변환

❌ RFC: Create a global login system for php.net

RFC: php.net용 글로벌 로그인 시스템 생성

❌ RFC: Short Closures 2.0

RFC: 짧은 Closures 2.0

Marcel Pociot(@marcelpociot)의 트윗

다음에 승인될 수 있도록 RFC를 개선해 봅시다.🤞

🤔 RFC: Auto-implement Stringable for string backed enums

RFC: 문자열 지원 열거형에 대한 Stringable 자동 구현

이 RFC는 문자열을 지원하는 열거형이 Stringable을 자동으로 구현하기를 제안하지만 여전히 메서드의 사용자 영역 구현은 허용하지 않습니다.

🤔 RFC: PDO driver specific sub-classes

RFC: PDO 드라이버별 하위 클래스

💡 RFC: Unify PHP’s typing modes (aka remove strict_type declare)

RFC: PHP의 타이핑 모드 통합(strict_type 선언 제거라고도 함)

타입 캐스팅 사용 및 개발자 부담에 미치는 영향에 대한 고려와 함께,
strict_type를 PHP(9+)에서 기본값으로 변경하는 draft 아이디어입니다.

PHP는 다른 언어와 비교하여 작동할 수 있는 두 가지 입력 모드가 있습니다. 하나는 너무 느슨하고 다른 하나는 너무 엄격합니다. 이 RFC는 이 두 모드의 존재 이유, 단점, 두 모드를 다시 통합하기 전에 변경해야 할 사항에 대해 설명합니다.

Tools

laravel/pint

laravel/pint – 미니멀리스트를 위한 PHP 코드 스타일 수정기(fixer). 기본적으로 FriendsOfPHP/PHP-CS-Fixer 래퍼지만 더 쉬운 구성과 멋진 출력을 제공합니다.

DaveLiddament/php-language-extensions

DaveLiddament/php-language-extensions - PHP 언어 확장을 정의하기 위한 속성(정적 분석에 의해 시행됨): #[Friend], #[Package]등.

currently in BETA.

RobiNN1/phpCacheAdmin

RobiNN1/phpCacheAdmin – Redis, Memcache(d) 및 OPCache용 웹 대시보드.

thecodingmachine/safe

thecodingmachine/safe – 에러가 발생하면 false를 반환하는 대신 예외를 발생시키도록 재작성된 PHP 함수 모음.

use function Safe\file_get_contents;
use function Safe\json_decode;

// This code is both safe and simple!
$content = file_get_contents('foobar.json');
$foobar = json_decode($content);

cerbero90/enum

cerbero90/enum – enum 기능을 강화하기 위한 종속성 없는 PHP 라이브러리.

PrinsFrank/standards

PrinsFrank/standards – ISO3166, ISO4217, ISO639 등 PHP Enum의 표준 모음입니다.

soatok/cupcake

soatok/cupcake – 간단하고 안전한 HTML form(생성 및 처리)을 위한 PHP 라이브러리입니다.

T-Regx/T-Regx

T-Regx/T-Regx – 현대 표준에 부합하는 PHP 정규식입니다. readme에서 preg_* 불일치에 대한 섹션을 확인하십시오.

어떤 인자는 preg_* 함수에 심각한(fatal) 에러를 발생시킵니다. T-Regx는 이를 예측하고, catch할 수 있도록 예외를 던집니다.

deComplex.me

deComplex.me – 두 코드 블록의 복잡성을 나란히 비교하는 웹 도구입니다.

PiotrPress/wordpress-hooks

PiotrPress/wordpress-hooks – attribute에 대한 좋은 사용 사례입니다! 라이브러리를 사용하면 WordPress Hooks(필터 및 작업)를 개체의 메서드에 자동으로 추가할 수 있습니다.

markrogoyski/itertools-php

markrogoyski/itertools-php – 루프를 강화하는 PHP 반복 도구.

Composer 2.4 will be released later this year

Composer 2.4는 올해 말에 출시될 예정이며 두 가지 새로운 명령을 제공합니다.

Symfony

Launched ux.symfony.com and released 4 New UX Components.

ux.symfony.com을 출시하고 4개의 새로운 UX 컴포넌트를 출시 했습니다 . 이 웹사이트는 각 UX 구성 요소를 만지고 샘플링하는 놀이터입니다.

Twig Smoke Rendering

Twig Smoke Rendering – Fortune Favors the Bold by Tomas Votruba.

Laravel

Vite is now the default frontend asset bundler in new Laravel projects

Vite는 이제 Breeze 및 Jetstream을 포함해 새로운 Laravel 프로젝트의 기본 프론트엔드 asset 번들러 입니다.

Taylor Otwell(@taylorotwell)의 트윗

새로운 Laravel 프로젝트가 Vite를 사용하여 프론트엔드 자산을 번들로 제공한다는 소식을 전하게 되어 기쁩니다. Breeze와 Jetstream도 업데이트되었습니다. 🔥
Inertia Vue 또는 React와 함께 새로운 Breeze/Vite 스택을 사용할 때 번개처럼 빠른 핫 모듈 교체를 경험하십시오. ⚡

Christoph Rumpel 의 Moving A Laravel Webpack Project To Vite 튜토리얼을 확인하십시오.

hammerstonedev/sidecar

hammerstonedev/sidecar – 이 패키지를 사용하면 Laravel 애플리케이션에서 AWS Lambda 기능을 배포하고 실행할 수 있습니다. 사용 사례의 예는 Browsershot을 통해 스크린샷을 만드는 것 입니다.

calebporzio/parental

calebporzio/parental – STI(Single Table Inheritance, 단일 테이블 상속) 기능을 Eloquent에 제공합니다.

STI : 모델을 확장하지만(일반적으로 특정 동작을 추가하기 위해) 동일한 테이블을 참조하는 것.

spatie/laravel-onboard

spatie/laravel-onboard – 앱에 대한 단계별 사용자 온보딩을 생성하기 위한 패키지입니다.

zgabievi/laravel-promocodes

zgabievi/laravel-promocodes – 강력한 쿠폰 및 프로모션 코드 생성기.

abrouter/laravel-abtest

abrouter/laravel-abtest – Laravel로 A/B 테스트를 실행하는 간단한 패키지입니다.

Running PHPStan on max with Laravel by Steve McDougall.

https://laravel-news.com/running-phpstan-on-max-with-laravel

PHPStan을 최대한으로 실행하기.

Add comments to SQL queries made by Laravel by Freek Van der Herten.

https://freek.dev/2279-add-comments-to-sql-queries-made-by-laravel

쿼리의 출처를 쉽게 찾아낼 수 있도록 Laravel이 만든 쿼리에 주석을 추가합니다.

Containerizing Laravel Applications by Matt Casperson.

https://www.honeybadger.io/blog/containerizing-laravel-applications/

기존 Laravel 애플리케이션을 컨테이너화하는 과정.

기타

The very useful variadic argument by Damien Seguy.

https://www.exakat.io/en/the-very-useful-variadic-argument/

정적 변수는 함수 호출이 끝날 때 죽지 않고 다음 호출까지 살아 있습니다.

class A {
public static function counter() {
static $i = 0;
return ++$i;
}
}
class B extends A {}

var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(1)
var_dump(B::counter()); // int(2)

PHP 8.0까지는 호출되는 클래스에 따라 고유한 정적 변수가 존재했습니다만, 8.1부터 바뀌었습니다.
이 글에서는 정적 변수의 문제와 이를 제거하는 방법을 설명합니다.

5 ways to give a name to your booleans by Damien Seguy.

bool에 이름을 지정하는 5가지 방법 - Damien Seguy

  • 상수로 만들고
  • enum으로 전환하고
    enum Comparison {
    case STRICT;
    case LOOSE;
    }

    function foo(bool $comparison) {}
    function goo(Comparison $comparison) {}

    foo(true);
    goo(Comparison::STRICT);
  • named parameter를 사용하고
    $v = in_array($needle, $haystack, strict: true); 
  • dummy 할당(assignation)을 사용하고
    $v = in_array($needle, $haystack, $strict = true); 
  • comment를 활용
    $v = in_array($needle, $haystack, /\* strict \*/ true);

Top 100 PHP classes that you should know by Damien Seguy.

당신이 알아야 할 100대 PHP 클래스 - Damien Seguy.

PHP version stats: July, 2022 by Brent Roose.

PHP 버전 통계 : 2022년 7월 by Brent Roose.

5 Pitfalls of Upgrade to Native PHP Enums and How to Avoid Them by Tomas Votruba.

네이티브 PHP 열거형으로 업그레이드할 때의 5가지 함정과 이를 피하는 방법 by Tomas Votruba

On the use of enums by Larry Garfield – When should you use PHP enums, and when shouldn’t you?

Larry Garfield의 enum 사용에 대해 – PHP enum을 언제 사용해야 하고 언제 사용하지 않아야 합니까?

Effective immutability with PHPStan by Matthias Noback – DateTimeImmutable is actually mutable.

Matthias Noback의 PHPStan을 사용한 효과적인 불변성 DateTimeImmutable은 실제로 변경 가능합니다.

$dt = new DateTimeImmutable('now');
echo $dt->getTimestamp() . "\n";

$dt->__construct('tomorrow');
echo $dt->getTimestamp() . "\n";

위와 같이 실제로 변경 가능하기 때문에, 진짜로 변경 가능하지 않도록 하려면 더 많은 노력이 듭니다.
그런데 대체 누가 __construct() 호출하나요?
그냥 마음 편하게 빌드 과정에서 PHPStan으로 잘 감시합시다…라고 하는 글입니다.

Benchmarking serialization by Larry Garfield.

Larry Garfield의 직렬화 벤치마킹.

Decoupling your security user from your user model by Matthias Noback.

Matthias Noback의 사용자 모델에서 보안 사용자 분리

Complete guide for PHP & Neo4j and using graph databases by Michal Štefaňák.

Michal Štefaňák의 PHP 및 Neo4j에 대한 완벽 가이드.

How to automatically add return type declarations with Rector and without breaking your code.

코드를 손상시키지 않고 Rector를 사용하여 반환 유형 선언을 자동으로 추가하는 방법.

PHP-FPM tuning: Using ‘pm static’ for max performance by Hayden James.

Hayden James의 PHP-FPM 튜닝: 최대 성능을 위해 ‘pm static’ 사용.

How can I trust my test suite? by Antonello D’Ippolito.

안토넬로 디폴리토의 내 테스트 스위트를 어떻게 신뢰할 수 있습니까?.

오디오/비디오

Community

  • Philip Sharp가 편집한 ElePHPants에 대한 현장 가이드. 57종의 코끼리가 있다는 사실, 알고 계셨나요?

  • PUFA – wordle과 비슷하지만 PHP 기능과 키워드를 추측하기 위한 것입니다.
    PUFA 화면

  • Frédéric Bouchery(@FredBouchery)의 트윗

    I just came back from the future, this is what I read on a tombstone
    #PHP #PhpNotDead

I DIDNT THINK I WOULD DIE BEFORE PHP 비석


오늘은 여기까지입니다. 읽어주셔서 감사합니다!

0%