PHP Annotated – March 2021
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
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
인터페이스는 테스트에서 쉽게 모킹되는, 현재 시간을 가져오는 단일 방법이 필요합니다.
namespace Psr\Clock; |
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)이 들어갑니다!
enum RfcStatus { |
열거형 기능이 마음에 들면 RFC 작성자인 Ilija Tovilo 및 Larry 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 이 예제에선,
|
내장 함수 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에서 일관되게 작동합니다.
$array1 = ['a' => 'apple', 'p' => 'pear']; |
❌ [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 v3로 동시에 실행되는 두 개의 #fiber를 만드는 것은 이렇게 간단합니다. #PHP
|
스케줄러가 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는 객체를 속성, 매개 변수, 상수 및 정적 변수에 대한 기본값으로 사용할 수 있도록 제안합니다.
static $x = 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의 영향을 받지 않습니다. 그러나 아래 예는 가능한 미래의 변화를 보여줍니다.
str_contains() -> String\contains() |
[RFC] noreturn type
https://wiki.php.net/rfc/noreturn_type
Psalm과 PHPStan의 저자는 noreturn이라는 새로운 유형을 PHP에 추가할 것을 제안합니다. 이것은 함수가 항상 exit(), die(), trigger_error()를 호출하는 등의 예외를 던지거나 실행을 종료함을 나타내는 유형입니다.
function redirect(string $uri): noreturn { |
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
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
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
버전 간에 아무것도 변경되지 않으면 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
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
- yiisoft/files
- yiisoft/var-dumper
- yiisoft/auth-jw
- yiisoft/log
- yiisoft/event-dispatcher
- yiisoft/network-utilities
- yiisoft/csrf
기타 읽을 만한 글
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%
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
- PHP Release Radar #5 – With Frank de Jonge about Flysystem 2.
- PHP Release Radar #6 – With Matthieu Napoli about Bref 1.0.
- PHP Release Radar #7 – With Kevin Dunglas and Antoine Bluchet about API Platform 2.6 and Panther 1.0.
🔈 Podcasts
php[architect] podcast #50
Mezzio 프레임 워크, 함수형 프로그래밍 및 소프트웨어 종속성 보안에 대해 논의했습니다.
PHP Ugly podcast
https://phpugly.simplecast.com/
PHP Internals News podcast
- #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.