1. 1. ⚡️ News
    1. 1.1. PHP 8.0.3, PHP 7.4.16
    2. 1.2. xdebug.cloud
    3. 1.3. WordPress share exceeds 40% among the top 10 million sites
    4. 1.4. New PSR ClockInterface standard proposed for consideration
    5. 1.5. PSR-11 Container Interface updates published
    6. 1.6. Composer 1.x is no longer supported
  2. 2. 🐘 PHP Internals
    1. 2.1. ✅ [RFC] Enumerations
    2. 2.2. ✅ [RFC] Deprecate passing null to non-nullable arguments of internal functions
    3. 2.3. ✅ [RFC] Array unpacking with string keys
    4. 2.4. ❌ [RFC] PHP\iterable\any() and all() on iterables
    5. 2.5. ❌ [RFC] var_representation() : readable alternative to var_export()
    6. 2.6. 🗳 [RFC] Fibers
    7. 2.7. 🗳 [RFC] mysqli bind in execute
    8. 2.8. [RFC] New in initializers
    9. 2.9. [RFC] CachedIterable (rewindable, allows any key&repeating keys)
    10. 2.10. [RFC] Namespaces in bundled PHP extensions
    11. 2.11. [RFC] noreturn type
  3. 3. PhpStorm
    1. 3.1. Mastering PhpStorm
    2. 3.2. PhpStorm 2021.1 EAP
    3. 3.3. Setup Step Debugging in PHP with Xdebug 3, Docker Compose, and PhpStorm
    4. 3.4. 🛠 Tools
    5. 3.5. spiral/RoadRunner v2.0.0
    6. 3.6. azjezz/psl
    7. 3.7. renoki-co/php-k8s
    8. 3.8. Comparison of markdown libraries for PHP
    9. 3.9. phpize.online
  4. 4. Symfony
    1. 4.1. symfony/runtime
    2. 4.2. symfony/panther 1.0
    3. 4.3. In In Symfony 6, the minimum version of PHP will be 8.0
    4. 4.4. Symfony packages are not tagged anymore
    5. 4.5. How to use the Symfony Lock component effectively
  5. 5. Laravel
    1. 5.1. Laravel Octane
    2. 5.2. Testing HTTP middleware in Laravel
    3. 5.3. A thread with tips on Laravel performance
    4. 5.4. RCE vulnerability in Laravel debug mode
    5. 5.5. Laravel 7 support has ended
    6. 5.6. spatie/laravel-remote
    7. 5.7. Step-by-Step Guide to Building Your First Laravel Application
  6. 6. Yii
    1. 6.1. Yii news 2021, issue 1
    2. 6.2. Fresh releases of Yii 3 components
  7. 7. 기타 읽을 만한 글
    1. 7.1. Complete guide to FFI in PHP
    2. 7.2. Character escape sequences and numeric notations in PHP
    3. 7.3. Unit testing tips by examples in PHP
    4. 7.4. When to use empty in PHP?
    5. 7.5. PHP 8: Observability Baked Right In
    6. 7.6. When Objects Are Not Enough
    7. 7.7. PHP benchmarks on arm64 vs x86_64
    8. 7.8. Moving From Nginx+FPM to Swoole Has Increased Our PHP API Performance by 91%
    9. 7.9. How Laminas CI automation works
  8. 8. 📺 Videos
  9. 9. 🔈 Podcasts
    1. 9.1. php[architect] podcast #50
    2. 9.2. PHP Ugly podcast
    3. 9.3. PHP Internals News podcast

PHP Annotated – March 2021

Php_annotated 이미지

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

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


⚡️ News

PHP 8.0.3, PHP 7.4.16

https://www.php.net/ChangeLog-8.php#8.0.3
https://www.php.net/ChangeLog-7.php#7.4.16

지원되는 branch의 정규 버그 수정 업데이트입니다.

xdebug.cloud

https://xdebug.cloud/

Docker, Vagrant 또는 클라우드 서비스를 사용할 때와 같이 더 복잡한 네트워크 구성에서 PHP 애플리케이션의 디버깅을 단순화하는 것을 목표로하는 Xdebug 작성자의 새로운 유료 서비스입니다.

WordPress share exceeds 40% among the top 10 million sites

https://w3techs.com/technologies/overview/content_management

워드 프레스 점유율은 상위 1000 만 사이트 중 40%를 초과합니다. w3techs에서 통계를 뽑기 위해 사용하는 방법론역사적 추세에 대해 자세히 알아보십시오.

New PSR ClockInterface standard proposed for consideration

https://github.com/php-fig/fig-standards/pull/1224/files?short_path=bc896a1#diff-bc896a1185817987d25269d5ba746546487d954744deaf3d8ff608f9babc17df

인터페이스는 테스트에서 쉽게 모킹되는, 현재 시간을 가져오는 단일 방법이 필요합니다.

1
2
3
4
5
6
7
8
9
namespace Psr\Clock;

interface ClockInterface
{
/**
* Returns the current time as a DateTimeImmutable Object
*/
public function now(): \DateTimeImmutable;
}

PSR-11 Container Interface updates published

https://github.com/php-fig/container

다른 표준과 마찬가지로 두 가지 버전이 한 번에 출시되었습니다. 1.1은 매개 변수 유형을 추가하고 2.0은 반환 유형을 포함합니다.

Composer 1.x is no longer supported

https://blog.packagist.com/deprecating-composer-1-support/

2021년 5월부터 packagist.org의 이전 API에 대한 액세스가 제한됩니다.

🐘 PHP Internals

✅ [RFC] Enumerations

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

PHP 8.1에는 오랫동안 기다려온 열거형(enum)이 들어갑니다!

1
2
3
4
5
6
7
8
9
10
11
12
enum RfcStatus {
case Draft;
case UnderDiscussion;
case Accepted;
}

function setRfcStatus(RfcStatus $status) :void {
// ...
}

setRFCStatus(RfcStatus::Accepted); // Ок
setRFCStatus('Draft'); // TypeError

열거형 기능이 마음에 들면 RFC 작성자인 Ilija ToviloLarry Garfield를 후원 해주십시오.

Brent Roose의 글이나 php.watch에서 더 자세히 알아보세요.

Symfony는 이미 열거형 지원을 추가하기 위해 티켓을 열었습니다.

✅ [RFC] Deprecate passing null to non-nullable arguments of internal functions

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

현재 버전의 PHP에서 표준 함수는 매개 변수가 nullable하지 않은 경우에도 오류없이 인수로 null을 허용 할 수 있습니다.

이 불일치를 수정하기 위해 PHP 8.1에서 내장 함수는 Deprecation 알림을 표시하고 PHP 9에서는 TypeError를 발생시킵니다. 예를 들어, 3v4l.org/OVoa0A 이 예제에선,

1
2
3
4
5
6
7
8
9
10
11
<?php

str_contains("", null);
// > No errors

function _str_contains ( string $haystack , string $needle ) : bool
{
return true;
}

_str_contains("", null);

내장 함수 str_contains를 사용한 str_contains( "", null);와 같은 코드는 TypeError가 발생하지 않는데,
직접 구현한 _str_contains()함수는 TypeError가 발생합니다. PHP 9에서는 내장 함수에도 이 규칙이 동일하게 적용됩니다.

✅ [RFC] Array unpacking with string keys

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

배열 풀기는 문자열 키가 있는 배열을 포함하여 PHP 8.1에서 일관되게 작동합니다.

1
2
3
4
5
$array1 = ['a' => 'apple', 'p' => 'pear'];
$array2 = ['b' => 'banana', 'o' => 'orange'];
$array = [...$array1, ...$array2];
// The same as:
$array = array_merge($array1, $array2);

❌ [RFC] PHP\iterable\any() and all() on iterables

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

반복자(iterable)에 대한 any() 및 all() 함수를 추가하라는 제안이 투표를 통과하지 못했습니다.

❌ [RFC] var_representation() : readable alternative to var_export()

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

var_export에 대한 대안을 추가하려는 아이디어도 공감받지 못했으므로 지금은 비공식적인 대안인 brick/varexporter를 사용할 수 있습니다.

🗳 [RFC] Fibers

https://wiki.php.net/rfc/fibers#vote

Fibers에 대한 투표가 시작되었습니다. 요컨대, 비동기 PHP 코드를 더 쉽게 작성하기 위해 노력하는 generator에 작지만 중요한 개선입니다. 예를 들면 다음과 같습니다.

Amp(@asyncphp)의 트윗

Amp v3로 동시에 실행되는 두 개의 #fiber를 만드는 것은 이렇게 간단합니다. #PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

use function Amp\{ async, await, delay };

await([
async(function () {
delay(1100);
echo "Later\n";
}),
async(function () {
delay(1000);
echo "First\n";
}),
]);

스케줄러가 RFC에서 제거되었으므로 Fiber API는 이제 최소한의 기능을 제공하며 Ruby의 유사한 기능과 닮았습니다.

Swoole 관리자(maintainer)의 제안에 대해 몇 가지 합리적인 논쟁이 있었습니다. krakjoe/parallel 확장의 저자인 Joe Watkins의 글도 마찬가지입니다.

아직까지 Fiber는 Swoole 또는 Parallel과 모순되지 않는, 비동기 기능으로 향하는 현실적인 단계에 있다고 보입니다.

2021-03-22까지 투표가 예정되어 있고, 현재 46:13으로 통과가 유력합니다.

🗳 [RFC] mysqli bind in execute

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

Kamil Tekiela는 mysqli를 개선하기 위한 이니셔티브를 계속합니다. 이 RFC는 mysqli_stmt::execute()에 새로운 선택적 매개 변수를 추가 할 것을 제안합니다. 현재는 참조로 전달된 변수만 허용하는 mysqli_stmt::bind_param()을 별도로 호출해야 합니다.

2021-03-27까지 투표가 예정되어 있고, 현재 26:0으로 통과가 유력합니다.

[RFC] New in initializers

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

현재 PHP 버전에서 속성, 매개 변수, 상수의 기본값과 같은 초기화 값은 상수 값만 가질 수 있습니다.

상수가 아닌 값이 필요한 경우 속성은 생성자에서 초기화 할 수 있으며 인수는 메서드의 본문에서 초기화 할 수 있습니다. 상수를 사용하면 그러한 옵션이 전혀 없습니다.

Nikita Popov는 객체를 속성, 매개 변수, 상수 및 정적 변수에 대한 기본값으로 사용할 수 있도록 제안합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static $x = new Foo();

const C = new Foo();

class Bar
{
public const CONSTANT = new Foo();
public static Foo $staticProperty = new Foo();

#[Assert\All([new Assert\Uuid()])]
public array $uuids = [];

public function __construct(
private Logger $logger = new NullLogger()
) {}
}

function test($param = new Foo()) {}

현재 제안은 new 연산자로 제한되지만 구현을 통해 향후 다른 표현식에 대한 지원을 확장 할 수 있습니다.

추가 보너스(의도적이었을까요? 🤔)는 객체가 속성에 허용된다는 것입니다. 이는 중첩된 속성의 문제를 해결합니다.

[RFC] CachedIterable (rewindable, allows any key&repeating keys)

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

Tyson Andre는 캐싱 반복자(iterator)를 추가할 것을 제안합니다. 반복의 상태를 저장하고 내부적으로 키와 값의 변경 불가능한(immutable) 사본을 포함합니다.

[RFC] Namespaces in bundled PHP extensions

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

번들 PHP 확장에서 제공하는 모든 클래스와 함수는 현재 전역 네임 스페이스에 있습니다(한 가지 예외가 있음).

이 RFC는 번들 확장이 있는 네임 스페이스 사용에 대한 규칙을 제안합니다. 기본적으로 확장 이름은 네임 스페이스로 사용해야하며 PHP 접두사는 필요하지 않습니다. 예를 들어 OpenSSLCertificate는 OpenSSL\Certificate가 될 수 있습니다.

그러나 지금까지는 추가된 새 심볼에만 적용되며 기존 함수 및 클래스의 마이그레이션은이 RFC의 영향을 받지 않습니다. 그러나 아래 예는 가능한 미래의 변화를 보여줍니다.

1
2
str_contains() -> String\contains()
in_array() -> Array\contains().

[RFC] noreturn type

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

Psalm과 PHPStan의 저자는 noreturn이라는 새로운 유형을 PHP에 추가할 것을 제안합니다. 이것은 함수가 항상 exit(), die(), trigger_error()를 호출하는 등의 예외를 던지거나 실행을 종료함을 나타내는 유형입니다.

1
2
3
4
5
6
7
function redirect(string $uri): noreturn {
header('Location: ' . $uri);
exit();
}
function redirectToLoginPage(): noreturn {
redirect('/login');
}

Hack과 Python에도 비슷한 유형이 있으며 Psalm, PHPStan 및 PhpStorm에서도 attribute인 #[NoReturn] 또는 .phpstormmeta.php의 exitPoint()를 통해 사용되었습니다.

PhpStorm

Mastering PhpStorm

https://masteringphpstorm.com/

Christoph Rumpel의 비디오 코스!

PhpStorm 2021.1 EAP

https://blog.jetbrains.com/phpstorm/2021/03/phpstorm-2021-1-eap-6/

이 Early Access Program이 곧 종료됩니다. 이번 릴리스는 새로운 기능을 추가하는 대신 안정성과 성능에 중점을 둡니다. 그러나 새로운 inspection 및 quick-fix들, 에디터에서 HTML 및 PHP 미리보기, JSONPath 지원, 오디오 및 비디오 호출을 통한 페어링 프로그래밍 등을 시도 할 수 있습니다.

Setup Step Debugging in PHP with Xdebug 3, Docker Compose, and PhpStorm

https://matthewsetter.com/setup-step-debugging-php-xdebug3-docker/

🛠 Tools

spiral/RoadRunner v2.0.0

https://github.com/spiral/roadrunner/releases/tag/v2.0.0

Golang으로 작성된 PHP 어플리케이션 서버(Nginx+FPM 대용)의 첫 메이저 릴리스.

azjezz/psl

https://github.com/azjezz/psl

hhvm/hsl에서 영감을 얻은 PHP 용 표준 라이브러리.

renoki-co/php-k8s

https://github.com/renoki-co/php-k8s

이 패키지를 사용하면 PHP 내에서 Kubernetes 리소스를 관리 할 수 ​​있습니다.

Comparison of markdown libraries for PHP

https://php.watch/articles/php-markdown-libraries

아래 네 가지 markdown 라이브러리의 성능 벤치마크, 확장의 용이성, 다양한 기능 및 특성을 비교합니다.

phpize.online

https://phpize.online/

3v4l.org와 유사하지만 SQL을 지원하는 PHP 코드 공유 도구입니다.

Symfony

symfony/runtime

https://github.com/symfony/runtime

새로운 실험적 구성 요소는 애플리케이션을 전역 상태에서 분리하고 PHP-FPM, CLI, PHP-PM, Swoole 등에서 변경없이 실행할 수 있도록합니다.

symfony/panther 1.0

https://github.com/symfony/panther

E2E 테스트 및 스크래핑을 위한 Selenium WebDriver 기반의 Symfony component입니다.

In In Symfony 6, the minimum version of PHP will be 8.0

https://github.com/symfony/symfony/issues/40389

Symfony 6에서 PHP의 최소 버전은 8.0입니다.

Symfony packages are not tagged anymore

https://symfony.com/blog/symfony-packages-are-not-tagged-anymore-when-nothing-changes-between-versions

버전 간에 아무것도 변경되지 않으면 Symfony 패키지에 더는 태그가 지정되지 않습니다.

How to use the Symfony Lock component effectively

https://developer.happyr.com/symfony-lock-and-messenger-component

Messenger를 예로 들어 Symfony Lock 구성 요소를 효과적으로 사용하는 방법.

Laravel

Laravel Octane

https://twitter.com/LaraconOnline/status/1372250802882977792

Laracon Online에서 Taylor Otwell은 Swoole 또는 RoadRunner 위에 고성능 Laravel 어플리케이션을 실행하는 범용 패키지를 선보였습니다.

Testing HTTP middleware in Laravel

https://www.kai-sassnowski.com/post/testing-http-middleware-in-laravel/

라라벨에서 HTTP middleware를 테스트하기.

A thread with tips on Laravel performance

https://threadreaderapp.com/thread/1356292193032368128

100일 동안 라라벨 성능에 관한 팁을 올리는 트윗을 모아보실 수 있습니다.

글을 올리는 계정은 Enlightn인데, 성능과 보안을 높이는 패키지를 서비스하는 것 같습니다.

Enlightn은 Laravel 앱 코드를 스캔하여 성능, 보안 등을 개선하기위한 실행 가능한 권장 사항을 제공합니다.

RCE vulnerability in Laravel debug mode

https://www.ambionics.io/blog/laravel-debug-rce

file_get_contents / file_put_contents 및 수동 FTP 모드를 사용한 공격 방식 조사.

  • Laravel <= v8.4.2 debug mode: Remote code execution (CVE-2021-3129)
    문제는 facade/ignition component에 있었습니다.

Laravel 7 support has ended

https://laravelversions.com/

Laravel 7은 지원이 종료됐습니다. 그러나 Laravel 6는 LTS이며 2022년 9월까지 지원됩니다.

spatie/laravel-remote

https://github.com/spatie/laravel-remote

spatie/ssh를 사용하여 원격 서버에서 Artisan 명령을 실행합니다. Freek Van der Herten과 함께 이 📺 스트림에서 자세히 알아보세요. 그는 이 동영상에서 이 패키지를 처음부터 작성합니다.

Step-by-Step Guide to Building Your First Laravel Application

https://laravel-news.com/your-first-laravel-application

첫 번째 Laravel 애플리케이션 구축을 위한 단계별 가이드.

Yii

Yii news 2021, issue 1

https://opencollective.com/yiisoft/updates/yii-news-2021-issue-1

Fresh releases of Yii 3 components

기타 읽을 만한 글

Complete guide to FFI in PHP

https://thephp.website/en/issue/php-ffi/

PHP FFI에 대한 완전한 가이드!

Character escape sequences and numeric notations in PHP

https://php.watch/articles/php-character-escape-sequences-numeric-notations

PHP의 문자 이스케이프 시퀀스 및 숫자 표기법.

Unit testing tips by examples in PHP

https://github.com/sarven/unit-testing-tips

PHP 예제로 보는 단위 테스트 팁.

When to use empty in PHP?

https://beberlei.de/2021/02/19/when_to_use_empty_in_php_i_say_never.html

언제 empty를 사용하는가?

Benjamin Eberlei는 결코 쓸 일이 없을 거라고 하네요.

PHP 8: Observability Baked Right In

https://www.datadoghq.com/blog/engineering/php-8-observability-baked-right-in/

Tracing 기능을 위한 내부(internal) API에 대한 기사입니다.

When Objects Are Not Enough

https://www.tonysm.com/when-objects-are-not-enough/

OOP에 대한 흥미로운 생각.

PHP benchmarks on arm64 vs x86_64

https://fraudmarc.com/arm64-vs-x86_64-for-php/

ARM을 사용하는 AWS는 20% 저렴하고 경우에 따라 더 빠릅니다.

Moving From Nginx+FPM to Swoole Has Increased Our PHP API Performance by 91%

https://eldadfux.medium.com/moving-from-nginx-fpm-to-swoole-has-increased-our-php-api-performance-by-91-40f62e51a064

Nginx + FPM에서 Swoole로 이동하여 PHP API 성능이 91% 향상되었다고 합니다. appwrite/appwrite 사용에 관한 이야기입니다.

Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps packaged as a set of Docker microservices.

How Laminas CI automation works

https://mwop.net/blog/2021-03-12-laminas-ci.html

Laminas CI 자동화 작동 방식 – 200개 이상의 패키지를 지원하고 테스트하고 릴리스하는 GitHub Actions에 관한 이야기입니다.

📺 Videos

🔈 Podcasts

php[architect] podcast #50

https://www.phparch.com/podcast/mezzio-framework-functional-programming-software-dependency-security/

Mezzio 프레임 워크, 함수형 프로그래밍 및 소프트웨어 종속성 보안에 대해 논의했습니다.

PHP Ugly podcast

https://phpugly.simplecast.com/

  • #227: – Math is Hard.
  • #226: – Help Wanted, PHP Release Manager.

PHP Internals News podcast

https://phpinternals.news/

  • #75 – With Nikita Popov on deprecating null, array unpacking, restrict globals usage, and phase out serializable.
  • #76 – Another one with Nikita Popov about restricting the use of globals, and phasing out serializable.
  • #77 – With David Gebler about the fsync() function added to PHP 8.1.
  • #78 – With Andreas Heigl on moving PHP documentation to Git.