PHP Annotated — October 2021
Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2021년 10월호의 번역/해석본입니다.
이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.
PHP 8.1 RC3이 출시 되었습니다. 열거형(enumeration)을 사용하는 첫 패키지도 이미 사용할 수 있습니다.
Magento의 커뮤니티 포크가 발표되었습니다.
PSR 외에도 PER이라는 새로운 유형의 권장 사항이 있습니다.
Symfony 6은 가능한 모든 곳에 타입을 선언합니다. 업데이트 방법은 무엇입니까?
PHP 8.2에서는 최적화된 새로운 데이터 구조와 독립형(standalone) null 타입이 제안되었습니다.
실제로는 취약점이 아니긴 하지만, disable_functions과 관련된 PHP 취약점이 게시되었습니다.
⚡️ News
PHP 8.1 RC 3
세 번째 릴리스 후보가 예정대로 발표되었습니다. PHP 8.1의 새로운 기능에 대한 개요는 What’s new in PHP 8.1 그리고 PHP 8.1: before and after 게시글을 참조하세요. 전체 변경 목록은 PHP.Watch에서 확인할 수 있습니다.
이제 PHP 8.1용 마이그레이션 가이드도 나왔습니다.
Mac에서 homebrew를 통해 php:8.1-rc-cli와 같은 이미지를 docker로 시도해보거나 그냥 3v4l.org를 둘러볼 수도 있습니다.
열거형(enumeration)을 사용하는 첫 패키지도 이미 사용할 수 있습니다.
alexanderpas/php-http-enum는 HTTP 응답 메시지의 상태 코드 및 텍스트가 포함된 열거형입니다.
PHP 8.0.11, 7.4.24 and 7.3.31
https://www.php.net/ChangeLog-8.php#8.0.11
https://www.php.net/ChangeLog-7.php#7.4.24
https://www.php.net/ChangeLog-7.php#7.3.31
보안 취약점 CVE-2021-21706 수정을 지원하는 업데이트.
이 수정 사항은 ZipArchive::extractTo가 Windows에서 특정 파일 경로 이름으로 대상 디렉토리 외부에 zip 아카이브를 추출하게 하는 버그를 해결합니다.
The Future of Magento
https://www.mage-os.community/blog/the-future-of-magento
Magento 커뮤니티 구성원의 이 편지는 커뮤니티 조직에서 운영하는 Magento 포크가 있을 것이라고 발표했습니다. 목표는 Magento의 장기적인 오픈 소스 수명을 보장하는 것입니다.
이전에 Adobe가 Magento를 마이크로서비스로 분해할 계획이라고 발표했습니다. 이것이 정확히 어떻게 일어날지는 불분명합니다. 이것이 포크가 생성되는 이유입니다. 후자가 열려 있는 한 Adobe의 Magento와 호환됩니다.
PhpStorm 2021.3 Early Access Program Is Open
https://blog.jetbrains.com/phpstorm/2021/09/phpstorm-2021-3-early-access-program-is-open/
PhpStorm 2021.3 Early Access 프로그램이 한창 진행 중입니다. 매주 JetBrains에서는 공식 릴리스 전에 새로운 기능을 사용해 볼 수 있는 새로운 빌드를 게시합니다.
다가오는 주요 릴리스에는 PHP 8.1에 대한 완전한 지원, 제네릭에 대한 많은 개선 사항, 배포를 위한 새로운 옵션, 업데이트된 디버거 인터페이스 등이 포함될 것입니다.
PER Workflow – PHP-FIG
https://www.php-fig.org/bylaws/per-workflow/
PHP-FIG는 PHP Evolving Recommendations의 아이디어를 승인했습니다. PSR 표준 외에도 영구적으로 변경 및 보완할 수 있는 권장 사항인 PER이 있습니다.
예를 들어 코드 스타일의 경우 새로운 언어 기능을 반영하는 새로운 규칙을 추가할 수 있습니다.
“Vulnerability” (not) in PHP to bypass disable_functions
한 연구원이 최근 php.ini의 disable_functions 지시문에 의해 설정된 제약 조건을 우회하는 방법을 발표했습니다.
disable_functions를 사용하여 PHP 스크립트에서 특정 기능의 사용을 금지할 수 있습니다. 예를 들어 system, exec, proc_open 및 shell_exec가 외부 프로그램에 대한 호출을 차단하는 것을 금지할 수 있습니다.
(그건 그렇고, eval()은 함수가 아니라 언어 구조이기 때문에 금지할 수 없습니다.)
disable_functions는 보안 기능이 아니며 보안을 위해 그것에 의존하는 것은 나쁜 생각이기 때문에 우회 문제는 취약점이라고 할 수 없습니다.
이게 PHP의 보안 문제가 맞다고 하는 글에 Nikita Popov(aka nikic)가 reddit에 댓글을 남겼습니다.
많은 스크립트 언어들처럼 PHP 구현이 임의의 공격자가 제어하는 코드를 안정적으로 샌드박싱하는 것이 주요 목표는 아니며, 보안 문제인지 여부는 위협 모델(threat model)에 따라 판단할 수 있는데 서버에 올라간 PHP 프로젝트에 관한 한 원격 공격자를 위협 모델로 상정한다고 합니다. 아래 내용에서 정확한 표현으로 확인하세요.
Whether something is a security issue depends on your threat model. As far as the PHP upstream project is concerned, our threat model is a remote attacker. We consider the case where the attacker has ability to execute arbitrary PHP code on the server a lost cause.
Of course, for a shared hosting provider that does not use any OS-level separation between clients, this is a security issue. As far as the PHP project is concerned, this is a fundamentally insecure deployment method. You may use it at your own risk.
This is a matter of practicality, because the PHP implementation is very far removed from reliably sandboxing arbitrary attacker-controlled code. There are some languages that have this as a hard design constraint (the most important being JavaScript), but for other scripting languages this is not a primary goal (definitely not for PHP, and I would strongly suspect not for Python or Ruby either, though I’m not sure on that count).
If we wanted to move in that direction, the first step would be to promote all remaining engine notices/warnings to exceptions, because there is a large class of interrupt vulnerabilities caused by them (to the point that addressing other issues would be somewhat “pointless” from a security perspective). One of my bigger regrets for PHP 8.0 is that we did not make undefined variables an exception.
PHP에서 보안 문제로 간주되는 것과 그렇지 않은 것에 대해 자세히 알아보십시오: wiki.php.net/security.
이 문서에선 다음과 같은 문제가 보안 문제 버그로 분류됩니다.
- 사용자가 승인되지 않은 작업을 실행할 수 있도록 허용하거나
- 보안 경계를 넘거나
- 액세스할 수 없는 데이터에 액세스하거나
- 시스템의 접근성 또는 성능에 심각한 영향을 미치는 경우
그리고 문제를 더 자세히 이해하는 데 관심이 있다면 disable_functions가 작동하는 방식과 그렇게 악용하는 방식(메모리 손상을 통한 우회)에 대한 멋진 분석이 있습니다. 그리고 다른 하나는 이러한 문제를 자동으로 검색하는 방법을 설명합니다.
또한, 인기 있는 Laravel 프로젝트인 fiveai/Cachet에서 발견된 실제 RCE(Remote Code Execution) 취약점 분석을 확인하십시오: Laravel Configuration Injection을 통한 코드 실행.
composer/composer 2.1.9
https://github.com/composer/composer/releases/tag/2.1.9
이 업데이트는 Windows의 취약점을 수정합니다(CVE-2021-41116). Windows 사용자는 반드시 업데이트해야 합니다.
PHPOpenDocs.com
PHP 관련 콘텐츠를 위한 커뮤니티 사이트를 만드는 실험입니다.
PHP 버전별로 그룹화된 기여자 목록이 있는 유용한 후원 페이지와 PHP 코드 구조 및 PHP 코어에 기여를 시작하는 방법에 대한 리소스에 대한 많은 링크가 있는 Internals 섹션이 이미 있습니다.
🐘 PHP Internals
New data structures in PHP
PHP는 list, 연관 배열, 큐, 스택 등으로 사용할 수 있는 범용 배열 데이터 구조를 가지고 있습니다.
이 다재다능함은 사실은 해시 테이블을 사용하여 달성됩니다. 그러나 이 다재다능함은 추가 메모리 사용량과 미묘한 성능 오버헤드를 대가로 합니다.
SPL(Standard PHP Library)은 보다 전문화된 데이터 구조를 가지고 있지만 그 자체로 무거운 감이 있습니다.
Tyson Andre는 PHP에 최적화된 새로운 데이터 구조를 추가할 것을 제안합니다.
이를 달성하기 위한 한 가지 옵션은 널리 사용되는 php-ds/ext-ds 확장에서 구조를 추가하는 것이지만 작성자는 이 아이디어를 지지하지는 않습니다. GitHub의 이 스레드는 토론의 세부 사항에 대한 정보를 제공합니다.
현재로서는 두 개의 RFC가 있습니다. 이러한 구조 및 기타 구조의 구현은 TysonAndre/pecl-teds 확장에서 사용할 수 있습니다.
[RFC] final class Vector
https://wiki.php.net/rfc/vector
벡터 구조 – 연속된 인덱스 0, 1, 2 등의 요소 집합입니다. 현재 배열보다 절반의 메모리가 필요하고 유사한 SPL 구조보다 빠르게 작동합니다.
API의 관점에서 보면, 이것은 ArrayAccess, IteratorAggregate 및 Countable 인터페이스를 가진 클래스입니다. RFC에는 아래와 같은 식의 final class를 추가하자는 내용이 나옵니다.
final class Vector implements IteratorAggregate, Countable, JsonSerializable, ArrayAccess |
ArrayAccess처럼 사용할 수도 있죠.
$values = new Vector(); |
[RFC] final class Deque
https://wiki.php.net/rfc/deque
Deque는 양방향 큐(doubly-linked queue)입니다. 즉, 시작과 끝에서 요소를 추가 및 제거할 수 있습니다. SplQueueue 또는 SplDoublyLinkedList 대신 사용하면 성능 및 메모리 소비가 즉시 개선되는 것을 볼 수 있습니다.
Deque는 메모리 관리에 대한 알려진 문제로 인해 대형 어레이를 사용하는 장기 실행 애플리케이션에 사용하기에도 적절합니다.
[RFC] Allow null as standalone type
https://wiki.php.net/rfc/null-standalone-type
George Peter Banyard는 타입 선언에서 null을 사용하는 기능을 추가할 것을 제안합니다.
첫째, 이것은 PHP의 타입 시스템의 완전성에 대한 누락된 부분입니다. mixed 타입과 never 타입이 추가됐고, union과 intersection이 있지만 unit 타입은 누락되었습니다.
둘째, 이 타입은 타입 힌트에 대한 일부 엣지 케이스를 다루고 정적 분석을 개선합니다.
예를 들어 현재로서는 유사타입(pseudotype)인 false를 union에서 사용할 수 있지만 함수가 false|null을 반환하도록 지정할 수는 없으며 bool|null만 반환할 수 있습니다.
How opcache works
https://www.npopov.com/2021/10/13/How-opcache-works.html
Nikita Popov는 항상 블로그 게시물을 작성하지는 않지만, 블로그 게시물을 작성할 때는 개념을 명확하고 자세하게 설명합니다.
🛠 Tools
Xdebug 3.1.0
https://xdebug.org/announcements/2021-10-04
인기 있는 PHP 디버거가 업데이트되었습니다. PHP 8.1, 많은 수정 사항 및 약간의 사소한 기능에 대한 지원이 함께 제공됩니다. 이 확장 프로그램 개발자인 Derick Rethans의 Xdebug 3에 대한 이 비디오 시리즈를 놓치지 마십시오.
spiral/roadrunner 2.4
https://github.com/spiral/roadrunner
Golang으로 작성된 PHP 애플리케이션 서버의 대규모 업데이트입니다. 이 릴리스에는 대기열(queue), 키-값 저장소 및 Temporal(분산형 오케스트레이션 도구)과의 통합에 대한 지원이 포함됩니다. 더 자세히 보려면 여기로.
brick/date-time
https://github.com/brick/date-time
날짜 및 시간 작업을 위한 immutable 클래스 집합입니다.
php-runtime/runtime
https://github.com/php-runtime/runtime
Runtime 컴포넌트는 애플리케이션 부트스트랩 로직을 전역 상태와 분리하므로 PHP-FPM, ReactPHP, Swoole 등과 같은 환경에서 아무 변경 없이도 애플리케이션을 실행할 수 있습니다.
원래 Symfony의 구성 요소였으나, 이제는 GitHub에서 별도의 조직(organization)이 될 정도로 훌륭하다고 여겨집니다.
rindow/rindow-neuralnetworks
https://github.com/rindow/rindow-neuralnetworks
Python Keras를 기반으로 하는 신경망 교육 프레임워크입니다. 해당 문서에 따르면 GPU 지원은 실험 모드 및 Windows에서만 사용할 수 있습니다.
piko-framework/router
https://github.com/piko-framework/router
또 다른 PHP 라우터인 이 라우터는 기수 트리(radix tree)를 기반으로 하며 벤치마크에 따르면 Symfony 라우터보다 빠릅니다.
nunomaduro/termwind
https://github.com/nunomaduro/termwind
Tailwind CSS 스타일 구문으로 콘솔 프로그램의 출력 형식을 지정하기 위한 PHP 8+ 패키지입니다.
icanhazstring/random-issue-picker
https://github.com/icanhazstring/random-issue-picker
Hacktoberfest에 참여하고 싶지만 어디서부터 시작해야 할지 모르겠다면 GitHub 또는 GitLab에서 무작위 문제를 선택하는 도구가 있습니다.
Symfony
Preparing your applications and bundles for Symfony 6
https://symfony.com/blog/preparing-your-apps-and-bundles-for-symfony-6
Symfony 5.4 및 6.0은 11월에 출시될 예정입니다. 차이점은 Symfony 5.4에는 더 이상 사용되지 않는 기능이 모두 포함되지만 Symfony 6.0에서는 모두 제거된다는 것입니다. 또한 Symfony 5.4 및 6.0 모두 가능한 경우 모든 메서드 속성, 인수 및 반환 값에 PHP 유형 선언이 추가됩니다.
Symfony 구성 요소를 사용하는 앱을 업데이트하는 방법을 알아보려면 Symfony Core 팀 구성원이 작성한 이 자세한 게시물을 확인하세요. Symfony 6: PHP 8 Native Types & Why We Need YOU.
you will no longer need flex.symfony.com
https://symfony.com/blog/symfony-flex-is-going-serverless
Symfony Flex의 경우 더 이상 flex.symfony.com이 필요하지 않습니다. 모든 레시피는 이제 github.com/symfony/recipes에 있습니다.
A week of Symfony #771 (4-10 October 2021)
https://symfony.com/blog/a-week-of-symfony-771-4-10-october-2021
Laravel
Working with fixture data in your tests.
https://dyrynda.com.au/blog/working-with-test-fixtures
정적 테스트 fixture를 다루는 방법을 이야기 합니다.
Strategies for decreasing the number of queries in a Laravel app.
https://freek.dev/2075-strategies-for-decreasing-the-number-of-queries-in-a-laravel-app
Laravel 앱에서 쿼리 수를 줄이기 위한 전략을 소개합니다.
📺 Laravel Worldwide Meetup #10:
A Little Bit of AWS Lambda, and Pest to Perfection.
📺 Converting a PHPUnit testsuite to Pest
https://www.youtube.com/watch?v=81-r9THrJhI
📺 Let’s Build an Online Store – A nice series of streams.
https://www.youtube.com/watch?v=-0C04evVV9A&list=PLKJBt7aeK3k8Ry6aNd4wUOvfXtlnQh5-O&index=1&t=5s
💡 기타 읽을 만한 글
The Road to PHP: Static Analysis
https://road-to-php.com/static
정적 분석에 대한 Brent Roose의 10일 뉴스레터입니다.
Testing tips from Matthias Noback:
One Class, One Test?
https://matthiasnoback.nl/2021/09/quick-testing-tips-one-test-per-class/
테스트가 없던 시절로 돌아가는 건 싫고, 실행하기 쉬운 규칙을 만들어 생각없이 테스트를 추가하는 게 정말 도움이 되겠느냐는 글.
Testing Anything; Better Than Testing Nothing?
https://matthiasnoback.nl/2021/09/testing-anything-better-than-testing-nothing/
없는 것보다는 나으니 아무거나 테스트하려는 사람들을 말리며, 테스트를 작성하지 말고 좋은 테스트를 작성하라고 합니다. 그렇게 하는 동안 테스트 작성이 재미있고 쉽고 효과적인지 확인하라고 하네요. 켄트백은 “테스트는 두려움을 지루함으로 변화시켜주는 프로그래머의 돌이다.”라고 했는데 말이죠…
어쨌든 이를 위해 다음에 투자해야 한다고 합니다.
- 특정 테스트를 매우 빠르게 실행하는 데 도움이 되는 테스트 도구
- 빠른 결과를 제공하는 테스트
- 다른 데이터가 제공될 때 코드가 어떻게 동작하는지 보여주기 위해 더 많은 테스트 케이스를 추가하는 것은 정말 저렴해야 합니다.
이런 게 “클래스 하나에 테스트 하나” 규칙이나 request 날리고 DB 확인하는 테스트(make-request-then-look-in-DB)보다는 나을 거라고 합니다.
Write Unit Tests Like Scenarios
https://matthiasnoback.nl/2021/09/write-unit-tests-like-scenarios/
읽기 좋은 테스트를 위해 시나리오를 작성하듯 코드를 작성하라는 조언입니다.
예시로 저자는 Give/When/Then 스타일로 작성합니다. naming 규칙에도 신경써야 하며 더 높은 추상화 수준에서 “왜”에 집중하며(해당 동작의 이유) 테스트를 작성하길 원합니다.
What happens when we clone objects?
https://doeken.org/blog/what-happens-when-we-clone
clone을 사용하면 어떤 일이 벌어질까?
Either
data structure.
https://marcosh.github.io/post/2021/09/24/either-why-or-how.html
Either 단일 데이터 유형/클래스에서 무언가가 두 가지 중 하나일 수 있다는 사실을 설명할 수 있는 데이터 구조입니다.
이를 구현하는 예제를 Haskell과 PHP로 구현합니다.
creating an Option
type in PHP
https://ryangjchandler.co.uk/posts/creating-an-option-type-in-php
PHP에 Option 추가하기.
null이나 nil 개념이 없는 Rust의 Option에서 아이디어를 얻어 Option type을 만드는 과정을 보여줍니다. PHP 8.0 이상.
Generic 지원은 PHPStan의 지원을 받습니다.
현재 PHP의 enum으로는 구현이 완벽하진 않고, RFC: Tagged Unions가 도입된다면 좀 더 Rust의 Option에 가까운 구현을 할 수 있다고 합니다…만, PHP 8.1을 목표로 한 RFC는 이 글을 번역하는 시점에 Draft 상태로 남아있습니다.
The €13.000 Video Course Launch That Made Me Believe In Myself Again
https://christoph-rumpel.com/2021/9/the-video-course-launch-that-made-me-belive-in-myself-again
Christoph Rumpel이 어떻게 masteringphpstorm.com 코스를 시작했는지에 대한 몇 가지 세부 정보를 공유합니다.
Generative art with PHP
https://www.binarymoon.co.uk/2021/09/creating-generative-art-with-php/
Ben Gillbanks는 코드를 사용하여 간단한 아바타에서 픽셀 아트 도시에 이르기까지 이미지를 만드는 방법을 설명합니다.
A game on FFI: quasilyte/kphp-game
https://github.com/quasilyte/kphp-game
KPHP는 PHP 컴파일러입니다. PHP의 제한된 하위 집합을 PHP보다 빠르게 실행되는 기본 바이너리로 컴파일합니다.
KPHP 팀의 사람들은 FFI에 대한 실험적 지원을 구현하고 데모로 FFI를 사용하여 작은 게임을 만들었습니다.
놀랍게도 KPHP-FFI는 기존 PHP의 FFI와 호환되므로 일반 PHP 7.4 이상에서도 게임을 실행할 수 있습니다.
이 PHP의 FFI에 대한 완전한 가이드(Complete guide to FFI in PHP)에서 다른 FFI 응용 프로그램에 대해 자세히 읽어보십시오.