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

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

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)이 들어갑니다!

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 이 예제에선,

<?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에서 일관되게 작동합니다.

$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

<?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는 객체를 속성, 매개 변수, 상수 및 정적 변수에 대한 기본값으로 사용할 수 있도록 제안합니다.

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의 영향을 받지 않습니다. 그러나 아래 예는 가능한 미래의 변화를 보여줍니다.

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()를 호출하는 등의 예외를 던지거나 실행을 종료함을 나타내는 유형입니다.

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.