ha-ah

로그, 게으른 로그

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP turned 25

https://www.jetbrains.com/lp/php-25/?_ga=2.202675409.1336001967.1592964633-44216834.1547258235

PHP가 25살이 되었습니다. PHP 역사에서 가장 인상적인 순간과 함께 타임라인을 살펴보세요.

PHP 7.4.7

https://www.php.net/releases/7_4_7.php

무엇보다도 yield from 버그가 해결되었습니다.

  • 7.4.6 버전은 스킵하는 게 좋을 거라는군요.

PHP 7.3.19

https://www.php.net/releases/7_3_19.php

Composer 2.0.0-alpha1

https://github.com/composer/composer/releases/tag/2.0.0-alpha1

The State of Developer Ecosystem in 2020

https://www.jetbrains.com/lp/devecosystem-2020/php/?_ga=2.158784506.1336001967.1592964633-44216834.1547258235

The State of Developer Ecosystem in 2020에서 PHP 섹션으로 바로 넘어가는 링크입니다.

응답자의 65%가 디버깅할 때 ‘dump & die’ 방식을 선택한다고 응답했습니다. 이에 Xdebug의 제작자인 Derick Rethans의 트윗은 커뮤니티에서 강한 반응을 일으켰습니다.

PHP developers that don’t use Xdebug for debugging are amateurs.

🐘 PHP Internals

✅ [RFC] Attribute Amendments

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

PHP 8에 accepted 된 기존 Attributes RFC에 몇가지 스펙을 추가했습니다.

  • PhpAttribute class를 Attribute로 rename
  • <<Attr1, Attr2>>처럼 그루핑하는 기능
  • Validation
  • 여러개의 동일한 속성을 추가하는 기능

✅ [RFC] Ensure correct signatures of magic methods

https://wiki.php.net/rfc/magic-methods-signature

지금까지는 magic method를 클래스 안에서 이렇게 선언할 수 있었습니다.

class Foo
{
function __get(int $name): void
{
echo $name;
}
}
(new Foo)->{42};

PHP 8부터는 메소드의 유효성을 검증하게 되고, compile-time error를 발생시킵니다. 위 코드는 첫번째 인자를 string이 아닌 값으로 선언했기 때문입니다. 이 버그 리포트도 참고하세요.

[RFC] Make sorting stable

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

PHP 8부터는 모든 표준 정렬 함수(sort, usort, asort, etc.)가 안정적(stable)으로 동작할 것입니다. 같은 값이라면 순서가 보장됩니다. 최신 버전에서는 stable하지 않게 동작하는 예를 찾기 어렵지 않습니다.

❌ [RFC] Opcache optimization without any caching

https://wiki.php.net/rfc/opcache.no_cache

거절됐습니다. (Declined)

[RFC] Make constructors and destructors return void

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

현재 버전의 PHP에서는 constructor나 destructor에서 아무 값이나 리턴할 수 있습니다. 예를 들면,

class Test {
public function __construct() {
return 0;
}
}

$test = new Test();

// this prints 0
echo $test->__construct();

Benas Seliuginas는 이런 상황에서 Deprecated warning을 던질 것을, 그리고 PHP 9에서는 이를 제거하고 Fatal Error를 발생시킬 것을 제안했습니다.

[RFC] Treat namespaced names as single token

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

인터프리터는 namespace의 각 요소를 분리된 토큰으로 다룹니다. 이것이 namespace에 키워드를 사용할 수 없는 이유였습니다. 예를 들어, namespace app\function { class Foo {} };는 Parse Error를 발생시킵니다. Nikita Popov는 새로운 키워드가 소개될 때 하위 호환을 문제를 최소화하기 위해, 전체 namespace를 하나의 토큰으로 고려할 수 있도록 제안했습니다.

[RFC] Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON

https://wiki.php.net/rfc/rename-double-colon-token

:: 토큰은 PHP에서 T_PAAMAYIM_NEKUDOTAYIM라고 불립니다. 이 문제는 PHP Sadness에서도 첫번째로 언급되었습니다. George Peter Banyard와 Kalle Sommer Nielsen은 이름을 바꾸길 제안했습니다.

이 monthly를 작성하는 Roman Pronskiy는,
“오류 메시지가 항상 ::를 참조하므로 이것이 의미가 있는지 확실하지 않습니다. 게다가 재밌는 역사적인 특정을 왜 지워야 하죠?”라고 하네요.

paamayim nekudotayim은 원래 이스라엘 사람이 작성한 Zend Engine에서 소개된 단어인데, double colon이라는 뜻입니다.

[RFC] Shorter Attribute Syntax

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

Attribute는 이미 PHP 8에 accepted 됐지만, 많은 사람들은 그 문법을 좋아하지 않았습니다. 세가지 옵션이 투표에 올라왔습니다.

<<Attr>> (현재 방식) vs. @@Attr vs. #[Attr]

Brent Roоse는 #[ ] 문법에 대해 몇 가지 설득력 있는 주장을 했습니다.

  • Rust와 같은 문법이며 이 또한 C 기반의 언어입니다.
  • 오래된 코드와 호환됩니다. #[Attribute] 문법은 PHP <=7.4까지 comment로 취급될 것입니다.
  • @@는 에러 억제 연산자와 혼동될 수 있습니다. (예시)
  • <<>> 역시 bit-shift 연산자와 혼동될 수 있습니다. 미래에는 단일 꺽쇄 연산자를 쓸 수도 있는 generics 문법과도 혼동될 수 있습니다.

그동안, @@이 더 많은 표를 받는 것으로 보입니다.

[RFC] Change terminology to ExcludeList

https://wiki.php.net/rfc/change-terminology-to-excludelist

불쾌감을 주는 용어(master/slave and blacklist)의 이름을 바꾸는 주제는 PHP 세계에서도 간과되지 않았습니다. Internals에서 열띈 토론이 있었습니다.

PHP 코어에서 이 변경 사항은 설정 지시자 단 한 부분에서만 영향을 미칩니다. opcache.blacklist_filename에서 opcache.exclude_list_filename를 바꾸려고 합니다. 많은 PHP 도구들은 이미 이와 관련하여 변경됐습니다 : PHPUnit, Drupal, Xdebug, Yii, Composer (+ working with non-master Git branches).

이런 불쾌감을 주는 단어를 찾기 위한 PHP_CodeSniffer 규칙 세트에 대한 토론도 있었습니다.

[RFC] Nullsafe operator

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

여러 중첩된 조건 대신, Ilija Tovilo는 null을 확인하기 위해 property 또는 method를 참조하는 기능을 추가할 것을 제안했습니다.

$country = $session?->user?->getAddress()?->country;

지금은 이렇게 체크해야 하죠.

$country =  null;

if ($session !== null) {
$user = $session->user;

if ($user !== null) {
$address = $user->getAddress();

if ($address !== null) {
$country = $address->country;
}
}
}

PHP 8.0 release schedule was updated

https://wiki.php.net/todo/php80

기능 확정(feature freeze)은 8월 4일로, 최종 릴리스(GA)는 11월 26일로 날짜가 변경됐습니다.
다른 활성 브랜치(7.4.13, 7.3.25)의 릴리스와 스케줄을 맞추기 위해서라는군요.

3v4l.org

https://3v4l.org/

PHP 8을 3v4l.org에서 사용해보실 수 있습니다. php-master branch에서 결과를 확인해보세요.

🛠 Tools

beyondcode/expose

https://github.com/beyondcode/expose

ReactPHP 위에 순수한 PHP로 구현된 터널링 서비스입니다. 여러분만의 자체 호스팅 서버도 실행할 수 있습니다. how it works 페이지에서 자세히 알아보세요.

pestphp/pest

https://github.com/pestphp/pest

PHPUnit 위에 구축되고 테스트를 간단하고 우아하게 작성할 수 있게 도와주는 도구입니다. 공식 문서와 많은 동영상 강좌도 있습니다. facebook/jest에서 영감을 받았다고 하네요.

Moxio/sqlite-extended-api

https://github.com/Moxio/sqlite-extended-api

FFI와 lisachenko/z-engine이 서로 어떻게 도움을 줄 수 있을지 실제 구현된 예제입니다. 이 패키지는 표준 PHP 드라이버에서는 할 수 없는 SQLite API 메소드를 제공합니다.

FriendsOfPHP/pickle

https://github.com/FriendsOfPHP/pickle

Composer와 호환되는 PECL extension 관리도구입니다. 2015 이후 첫 업데이트가 있었고, 결국 Composer와 완전히 통합할 계획을 세웠습니다.

doctrine/migrations 3.0.0

https://github.com/doctrine/migrations/releases/tag/3.0.0

DB 마이그레이션을 처리하는, 잘 알려진 패키지의 주요 업데이트.

Symfony

Symfony 5.1 was released.

https://symfony.com/blog/symfony-5-1-curated-new-features

Symfony 5 certification is now available

https://symfony.com/blog/the-symfony-5-certification-is-now-available

In Symfony 6, configurations will be handled in usual PHP files

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

Symfony 6에서 configuration 설정에 YAML이나 XML 대신 PHP file을 사용하기로 했습니다.

dbu/snake-bundle

https://github.com/dbu/snake-bundle

symfony/console로 구현한 snake game

How much of a performance boost can you expect for a Symfony 5 app with PHP OPcache preloading?

https://www.ibexa.co/blog/how-much-of-a-performance-boost-can-you-expect-for-a-symfony-5-app-with-php-opcache-preloading

PHP OPcache preloading으로 얼마나 성능을 개선할 수 있을지 실험한 결과입니다.
현실적인 예제에서는 평균 10% 정도의 개선이 있는 것으로 보입니다.

10 Symfony testing tips.

https://blog.cemunalan.com.tr/2020/02/02/10-symfony-testing-tips/

Protect Symfony app against the OWASP Top 10 threats.

https://nicwortel.nl/blog/2020/06/07/protect-symfony-application-against-owasp-top-10-security-risks

PHP에서 10가지 주요 보안 위협을 대응하는 방법을 살펴 봅니다.

  1. Injection
  2. Broken authentication
  3. Sensitive data exposure
  4. XML external entities (XXE)
  5. Broken access control
  6. Security misconfiguration
  7. Cross-site scripting (XSS)
  8. Insecure deserialization
  9. Using components with known vulnerabilities
  10. Insufficient monitoring & logging

Laravel

spatie/laravel-cronless-schedule

https://github.com/spatie/laravel-cronless-schedule

cron 없이 예약 작업을 수행하는 패키지입니다. 내부적으로는 ReactPHP와 timer를 사용합니다. 소개 페이지에서 더 자세히 알아보세요.

Laravel Debugbar vs. Telescope Toolbar

https://barryvdh.nl/laravel/debugbar/telescope/2020/06/14/laravel-debugbar-vs-telescope-toolbar/

글쓴이는 Telescope를 이미 사용하고 있다면, 부하를 피하기 위해서 Telescope Toolbar를 추천한다고 합니다. Laravel Debugbar를 선호하지만 너무 무겁다고 생각되면 Telescope Toolbar를 사용해보라고 하네요.

Adding try/catch Laravel collections.

https://freek.dev/1691-adding-trycatch-to-laravel-collections

Jason McCreary라는 사람이 트위터에서 try/catch를 chaining하는 아이디어를 이야기했고, 글쓴이(Van der Herten)와 페어 코딩을 진행해서 laravel-collection-macrostrycatch 메소드를 추가했습니다. 이를 사용하는 법과 작동 원리를 소개하는 글입니다.

Laravel package ecosystem statistics.

https://itnext.io/laravel-package-ecosystem-4afd53fad192

tactics you can use to write cleaner code in Laravel

https://twitter.com/samuelstancl/status/1272822437181378561

Yii

Yii2 & Doctrine ORM simple integration.

https://medium.com/rigor-guild/yii2-doctrine-orm-simple-integration-fb0625002a40

Zend/Laminas

Is Zend Framework Dead?

https://www.youtube.com/watch?v=5luPg2oVUIk

Laminas project의 lead인 Matthew Weier O’Phinney가 “Zend Framework이 죽었는가?”라는 질문을 포함한 또 다른 질문에 답을 합니다.

asgrim/mini-mezzio

https://github.com/asgrim/mini-mezzio

이 패키지를 사용하여 Mezzio 애플리케이션을 더욱 빠르게 설정하십시오.

🌀 Async PHP

badfarm/zanzara

https://github.com/badfarm/zanzara

ReactPHP 기반의 Telegram bot을 만들어주는 비동기 프레임웍.

simple-swoole/simps

https://github.com/simple-swoole/simps

Swoole 기반의 프레임웍. Benchmark에 따르면 PHP로 작성된 것 중에는 가장 빠릅니다.

📺 Video course on ReactPHP by Marcel Pociot.

https://beyondco.de/video-courses#:~:text=Learning%20ReactPHP

💡 기타 읽을 만한 글

Introducing the new Serverless LAMP stack

https://aws.amazon.com/blogs/compute/introducing-the-new-serverless-lamp-stack/

AWS 블로그에 올라온 serverless PHP 사용법과 Serverless LAMP stack을 주제로 한 커뮤니티의 좋은 자료가 소개됐습니다.

또한, Amazon의 공식 AWS Toolkit 플러그인도 이제 PhpStorm에서 사용할 수 있습니다.

Constructor promotion in PHP 8

https://stitcher.io/blog/constructor-promotion-in-php-8

PHP 8에서는 아래처럼 작성하는 대신

class CustomerDTO
{
public string $name;

public string $email;

public DateTimeImmutable $birth_date;

public function __construct(
string $name,
string $email,
DateTimeImmutable $birth_date
) {
$this->name = $name;
$this->email = $email;
$this->birth_date = $birth_date;
}
}

이렇게 사용할 수 있습니다.

class CustomerDTO
{
public function __construct(
public string $name,
public string $email,
public DateTimeImmutable $birth_date,
) {}
}

이런 Constructor property 승격(promotion)이 어떻게 동작하는지 자세히 설명합니다.

What are the top most used PHP functions in frameworks?

https://thephp.website/en/issue/most-used-php-functions/

Symfony에서는 sprintf(), 라라벨에서는 is_null()입니다. 다른 프레임 워크에 대해 유사한 통계를 계산하는 방법에 대한 지침도 있습니다.

final classes in PHP

https://medium.com/swlh/final-classes-in-php-9174e3e2747e

Final class의 이점.

The fastest template engine for PHP

https://medium.com/@gotzmann/the-fastest-template-engine-for-php-b5b461b46296

Unit test naming conventions

https://matthiasnoback.nl/2020/06/unit-test-naming-conventions/

📺 Videos

PHP Russia 2020 Online

https://habr.com/ru/company/badoo/blog/487264/

How to generate and view code coverage reports in PhpStorm using PHPUnit and Xdebug

https://freek.dev/1674-how-to-generate-and-view-code-coverage-reports-in-phpstorm-using-phpunit-and-xdebug

🔈 Podcasts

Voices of the ElePHPant

https://voicesoftheelephpant.com/2020/06/09/interview-with-nuno-maduro/

Interview with Nuno Maduro.

PHPUgly 194: Oversight

https://phpugly.simplecast.com/episodes/194

PHP Internals News Podcast by Derick Rethans

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP

PHP 7.4.5, PHP 7.3.17, and PHP 7.2.30 are released.

Composer v2.0 Alpha

https://php.watch/articles/composer-2

4월 5일은 Composer repository에 첫 commit이 올라온 지 딱 9년째 되는 날이었습니다. 두번째 메이저 릴리스에서 어떤 점이 추가됐고 어떻게 변경됐는지 확인할 수 있습니다. 지금 composer self-update --snapshot를 실행해보세요.

실행하면 최신 스냅샷으로 업데이트 됩니다.

❯ composer self-update --snapshot
Updating to version 8ea787baa170ee462ee791c65b469ef62790f8aa (snapshot channel).
Downloading (100%)
Use composer self-update --rollback to return to version 1.10.5

다시 돌아가고 싶다면 composer self-update --rollback
혹은 특정 버전으로 업데이트 composer self-update 1.10.5

바뀐 점 몇 가지 소개해드릴게요.

Faster download times

Packages와 meta data를 병렬로 다운로드 되기 때문에, 캐시가 없는 상태라면 버전 1에 비해 2배 가량 빠릅니다. 게다가 HTTP/2를 사용해 TLS session과 DNS 응답을 공유해 더욱 속도를 낼 수 있었습니다.

Composer v1이라면 hirak/prestissimo로 이런 효과를 조금 얻을 수 있습니다.

Partial offline support

COMPOSER_DISABLE_NETWORK라는 환경 변수가 1로 세팅되어 있다면, 네트웍을 전혀 사용하지 않고 composer.lock과 캐시된 파일만으로 설치를 시도합니다.

Dry-run support for require and remove commands

말 그대로 require와 remove 커맨드에 --dry-run 옵션이 추가되어 실제 업데이트 하지 않고도 시험해볼 수 있습니다.

Running as root requires confirmation

root 사용자로 실행하는 건 위험한 일이지만 간혹 필요한 상황이 있습니다. 이전 버전에선 root 사용자로 실행하면 warning을 띄우는데 그쳤다면, 이제는 질문에 답을 해야 합니다. 물론 interaction flag를 꺼둘 수도 있긴 합니다.

New repository metadata format

새로운 repository metadata format을 제공합니다. 새로운 포맷은 가볍고, repository 운영자가 개별 패키지를 위한 URL endpoint를 제공할 수 있게 됩니다.

Packagist.org는 이미 지원하고 있답니다.

PhpStorm 2020.1

https://www.jetbrains.com/phpstorm/whatsnew/?_ga=2.91147290.1244278781.1587564338-44216834.1547258235

주요 변화는

  • composer.json support
  • Code coverage with PCOV and PHPDBG
    • Code coverage 측정을 위해 Xdebug 뿐 아니라 가벼운 krakjoe/pcov나 훨씬 빠른 커버리지 측정을 할 수 있는 built-in PHPDBG를 선택할 수 있게 됐습니다.
  • PHPUnit toolbox
    • PHPUnit 버전을 빠르고 쉽게 업그레이드 할 수 있게 해주는 툴
    • 에디터에서는 deprecation을 보여주고 제안하기도 합니다
  • PHP type inference improvements
    • 몇몇 타입 추론이 개선됐습니다
  • ML-assisted ranking for code completion
    • 코드 완성 도구 팝업에서 머신 러닝 기반으로 추천 순서를 바꿔줍니다. 기본으로 disabled 되어 있답니다.
    • 궁금하신 분들은, PHP under Preferences/Settings | Editor | General | Code Completion.
  • Metadata
    • 원래 .phpstorm.meta.php를 활용해 메타데이터를 설정할 수 있었는데, 많은 발전이 있었다고 합니다. 여전히 활발히 개발중인 도구입니다.
  • PHP Debug in HTTP Client
    • HTTP Client를 통해 실행할 때도 XDebug 같은 디버깅 툴을 사용할 수 있습니다.
  • default font 추가 : JetBrains Mono
  • 모든 OS에서 동일한 테마로 설정할 수 있는 light theme : IntelliJ Light
  • Git > Interactively Rebase from Here 가능이 많이 개선 됐습니다.
  • Commit 창이 그동안 modal만 있었는데, 일반 탭처럼 사용할 수 있는 옵션이 있습니다.
  • Database Tools
    • Excel export 기능
    • 에디터의 쿼리 아래 바로 실행 결과를 보여주는 옵션
    • Run configurations에서 DB 쿼리 실행
  • 괄호의 시작과 끝을 옮겨다닐 수 있는 Action 추가! (맥에서는 ^M)

🐘 PHP Internals

PHP 8 release schedule

https://wiki.php.net/todo/php80

첫 알파 버전은 6월 18일로 예상하고 최종 릴리스는 12월 3일로 계획되어 있습니다.

[RFC] Constructor Property Promotion

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

Larry Garfield가 analysis of PHP’s object ergonomics라는 상세한 분석을 썼습니다. (2020년 4월 22일 현재 이 페이지는 접근이 되지 않습니다)

그는 아래 세가지 RFC에 집중해야 한다고 끝마쳤는데요.

  • constructor promotion
  • named parameters
  • compound Property Visibility

그 분석에 따르면, 이 RFC 제안들은 이런 코드를

class Point {
public float $x;
public float $y;
public float $z;

public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

이렇게 쓸 수 있게 해준답니다.

class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0
) {}
}

[RFC] Allow trailing comma in parameter list

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

PHP 7.3부터는 함수 호출 시 argument 목록 끝에 comma를 넣을 수 있었는데요. 선언부에도 허용하도록 제안이 올라왔습니다. target은 PHP 8.0입니다.

[RFC] Stricter type checks for arithmetic/bitwise operators

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

배열이나 resource, object 등에 산술/비트 연산을 시도하면 TypeError를 발생시키는 제안입니다.

[RFC] Type casting in array destructuring expressions

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

예제를 살펴보시죠.

[(int) $now, (int) $future] = ["2020", "2021"];

// The same as the following
[$now, $future] = ["2020", "2021"];
$now = (int) $now;
$future = (int) $future;

[RFC] throw expression

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

이 제안은 accept 됐습니다. PHP 8에서 throw는 더이상 문(statement)이 아니라 식(expression)으로 인식됩니다. 그 말은, arrow 함수, 3항 연산자 등의 구조에서 사용될 수 있다는 말입니다.

$callable = fn() => throw new Exception();

$foo = $bar['key'] ?? throw new KeyNotSetOnBarException();

[RFC] Attributes v2

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

Benjamin Eberlei와 Martin Schröder가 제안한, 흔히 annotation이라고 불리는 attribute 기능을 PHP core로 가져오기 위한 제안이 크게 진전이 있었습니다.
제안이 통과할 가능성이 매우 크고, 문법은 << >> 혹은 @:. 중에 투표 중입니다. 5월 4일까지 투표를 진행합니다. << >> 문법이 압도적이네요.

<<ExampleAttribute>>
class Foo
{
<<ExampleAttribute>>
public $x;

<<ExampleAttribute>>
public function foo(<<ExampleAttribute>> $bar) { }
}

[RFC] Mixed Type v2

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

현재 return 타입이 명시되지 않은 함수는 개발자가 잊은 건지 어떤 이유로 넣지 않기로 한 것인지 확실하지 않았습니다. 게다가 mixed라는 pseudotype은 이미 PHP manual에서 사용되고 있었죠.
Máté Kocsis와 Danack은 mixed 타입을 PHP 8에 넣자고 제안했습니다. array|bool|callable|int|float|null|object|resource|string 타입의 결합을 의미하도록 말이죠.

[RFC] non-capturing catches

https://wiki.php.net/rfc/non-capturing_catches

catch block에서 사용하지도 않을 변수를 선언하지 않도록 생략하게 해주는 RFC입니다.

try {
changeImportantData();
} catch (PermissionException) { // The intention is clear: exception details are irrelevant
echo "You don't have permission to do this";
}

[RFC] Match expression

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

이전에 올라온 것처럼 switch의 구조를 변경하지 않고 Ilija Tovilo는 match라는 표현을 사용해 switch문의 결함(타입 체크가 안 되는 문제나 값을 반환할 수 없는 점 등)을 피하도록 제안했습니다. 훗날 패턴 매칭으로도 확장할 수 있을 것으로 기대하고 있습니다.

$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};

[RFC] Pipe Operator v2

https://wiki.php.net/rfc/pipe-operator-v2

두번째 올라오는 Pipe Operator(|>) 제안입니다. 순차적으로 실행하면서 이전 함수의 결과를 다음 함수의 인자로 넘겨줄 수 있게 합니다.

$result = "Hello World"
|> 'htmlentities'
|> 'explode'
|> fn($x) => array_map(fn($v) => 'strtoupper', $x)
|> fn($x) => array_filter(fn($v) => $v != 'O');

거절된 제안들

Server-Side Request and Response Objects
Userspace operator overloading
Write-Once (readonly) Properties
Compact Object Property Assignment

🛠 Tools

jlaswell/compote

https://github.com/jlaswell/compote

Go로 만들어진 가벼운(lightweight) 의존성 관리 도구. Composer를 대체하기위한 것이 아니라 CI 파이프라인, 자동화 workflow, 메모리가 제한된 환경 등의 특정 사용 사례를 보완하는 것입니다.

repman.io

https://repman.io/

Private PHP Package Repository Manager.

Add and manage private PHP Composer dependencies in Cloud or behind your firewall

global CDN을 통해 packagist.org의 proxy를 제공하기도 합니다.

clue/graph-composer

https://github.com/clue/graph-composer

여러분 프로젝트의 composer 의존성을 그래프로 그려줍니다.

VKCOM/noverify v0.2.0

https://github.com/VKCOM/noverify/releases/tag/v0.2.0

Go로 만들어진 PHP를 위한 정적 분석 도구입니다.

markrogoyski/math-php 1.0

https://github.com/markrogoyski/math-php

MathPHP - Powerful Modern Math Library for PHP

첫 stable 릴리스입니다.

ackintosh/ganesha 1.0

https://github.com/ackintosh/ganesha

PHP 어플리케이션을 위한 Circuit Breaker 패턴 구현체입니다.

이 블로그 포스트를 확인해보세요.

Spiral Framework

https://spiral.dev/

고성능의 hybrid PHP+Go framework.

Symfony

migrify/symfony-route-usage

https://github.com/migrify/symfony-route-usage

Symfony app에서 사용하지 안는 route를 찾도록 도와줍니다. 이 블로그 포스트를 확인하세요.

How to Migrate Spaghetti to 304 Symfony 5 Controllers Over Weekend

https://www.tomasvotruba.com/blog/2020/04/13/how-to-migrate-spaghetti-to-304-symfony-5-controllers-over-weekend/

A Week of Symfony #694 (13-19 April 2020)

https://symfony.com/blog/a-week-of-symfony-694-13-19-april-2020

Laravel

6 Laravel Eloquent Secrets

https://laravel-news.com/6-eloquent-secrets

  • Snake Attributes
  • Pagination
  • Appending custom values to models
  • Mutators for non-existing columns
  • Eager loading with $with
  • Model keys

Building complex forms with Laravel Livewire

https://freek.dev/1609-building-complex-forms-with-laravel-livewire-in-oh-dear

Oh Dear라는 서비스에서 복잡한 form 렌더링을 위해 Livewire를 사용한 방식을 소개합니다.

Mixing event sourcing in a traditional Laravel app

https://freek.dev/1634-mixing-event-sourcing-in-a-traditional-laravel-app

Brent의 동료인 Freek이 함께 일하는 프로젝트에서 논의한 내용을 두 부분을 나누어 각자 글을 올렸습니다.

그들은 상태 기반 시스템과 이벤트 소스 시스템을 결합하는 방법을 찾고 싶었고, 강력한 bounded context를 생성해서 이벤트에만 의존해 통신하도록 설계했다고 합니다.

우선 Brent가 먼저 Combining event sourcing and stateful systems라는 시스템의 설계에 관해 글을 올렸고,

이를 어떻게 구현했는지 Freek가 이 글에서 설명합니다.

Dynamic relationships in Laravel using subqueries

https://reinink.ca/articles/dynamic-relationships-in-laravel-using-subqueries

Rethinking Laravel’s middleware argument API

https://timacdonald.me/rethinking-laravels-middleware-argument-api/

The Beauty of Single Action Controllers

https://driesvints.com/blog/the-beauty-of-single-action-controllers/

Jeffrey Way가 올린 트윗(현재 찾을 수 없음)에서 컨트롤러 이름을 단수로 짓는지 복수로 짓는지 질문했습니다. 이에 Dries Vints는 둘 다 해당하지 않고, 하나의 역할만 하는 Single Action Controller를 만든다고 답했고 이에 대한 생각을 글로 풀어냈습니다.

📺 Screencasts from Mohamed Said

Mohamed Said가 Laravel에서 CSRF protection, CORS, authentication, HTTP Middleware가 어떻게 동작하는지 설명합니다.

🔈 The Laravel Podcast

https://laravelpodcast.com/episodes/the-ethos-of-laravel

The Ethos of Laravel, with Taylor Otwell

Yii

Yii news 2020, issue 3

https://opencollective.com/yiisoft/updates/yii-news-2020-issue-3

Zend/Laminas

April 2020 Technical Steering Committee Meeting

https://getlaminas.org/blog/2020-04-07-tsc-meeting.html

🌀 Async PHP

hyperf/hyperf

https://github.com/hyperf/hyperf

A framework for building microservices or middlewares based on Swoole coroutines.

clue/reactphp-flux

https://github.com/clue/reactphp-flux

이 패키지를 사용하면 ReactPHP에서 동시에 실행되는 작업의 수를 제한할 수 있습니다.

기타 읽을 만한 글

Testing without mocking frameworks.

https://blog.frankdejonge.nl/testing-without-mocking-frameworks/

Coding with feature flags.

https://www.boxuk.com/insight/coding-with-feature-flags/

Feature flag(flag 값을 사용해서 특정 기능을 켜고 끄는 것)의 종류와 이를 CD(Continuous Delivery)에 활용해 좀 더 빠르게 피드백을 받고 배포할 수 있다는 주장.

Testing composer plugins.

https://blog.cebe.cc/posts/2020-04-17/testing-composer-plugins

Yii Framework에서 composer plugin 테스트

Improve your Design with CQRS.

https://thephp.cc/news/2020/04/improve-design-with-cqrs

SerafimArts/opengl-demo

https://github.com/SerafimArts/opengl-demo

FFI를 활용해 순수하게 PHP 만으로(음? 이게 순수한 것임??) OpenGL(SDL)를 사용하는 예제입니다.

A Snake Game Written in PHP

https://thephp.website/en/issue/games-with-php/

With joseph-montanez/raylib-php.

💵 Advanced Web Application Architecture

https://matthiasnoback.nl/2020/04/early-release-of-web-application-architecture-book/

Matthias Noback의 새로운 책입니다. 2주 마다 새로운 장이 발표됩니다.

💵 PHP Mentors

http://www.phpmentors.com/

code, career, teamwork 등에 관한 질문에 전세계 PHP 마스터에게 대답을 들고 책으로 엮었습니다.

📺 Videos

📺 Tips on styling and navigation with PhpStorm

https://blog.jetbrains.com/phpstorm/2020/04/new-video-series-phpstorm-tips-with-christoph-rumpel/

from @christophrumpel.

PhpStorm에서 스타일을 바꾸는 것, 파일 간 이동하는 방법 등을 설명합니다.

📺 Visual Perception of Code

https://www.youtube.com/watch?v=5qRFxMCEbLs

코드의 모양이 생산성에 미치는 엄청난 영향을 탐구합니다.

이외 관한 글을 올리고 영상에 나온 링크를 소개하기도 했습니다.

🔈 Podcasts

PHP Internals News Podcast by Derick Rethans

2019년에 읽은 책

  • 1월 사용자를 생각하게 하지마
  • 5월 틀리지 않는 법
  • 5월 테스트 주도 개발로 배우는 객체 지향 설계와 실천
  • 6월 죽기 전까지 걷고 싶다면 스쿼트를 하라
  • 6월 Management 3.0
  • 6월 함께 자라기
  • 8월 마인드셋
  • 9월 오브젝트
  • 10월 테크니컬 리더
  • 12월 도메인주도 설계 핵심

2019년 회고를 하기에는 너무나 바쁘고 힘든 시기였기 때문에, 대충 읽은 책이나 곱씹어본다. 2019년 초에 했던 2018년 회고에는 더 많은 책을 읽는 것을 목표로 했었지만, 막상 2019년에 되어서는 책을 좀 제대로 읽자는 컨셉으로 바뀌었고, 나쁘지 않았다. 대부분 훌륭한 책만 골라 읽었기 때문일 수도 있지만, 평소보다 깊게 읽었기 때문이기도.

‘사용자를 생각하게 하지마’는 사내 스터디를 하면서 시작했던 책이고, 너무 유명해서 안 봤었지만 생각보다 좋았다. 그 책보다는 함께 스터디를 진행하면서 얻은 것이 매우 많았다.

이 스터디 이후 ‘테스트 주도 개발로 배우는 객체 지향 설계와 실천’으로 TDD 스터디를 시작했는데, 두번째 읽는 것임에도 전혀 새로운 내용이었다. 아는 만큼 보인다고, 그 동안 많이 성장했나 싶기도 했고 다시 또 읽고 보겠다는 다짐을 했는데, 지금은 어떻게 다가올지 궁금하기도 하다. 이것도 꽤나 고통스럽게 이해한 책.

쉬엄 쉬엄 읽고 있던 ‘틀리지 않는 법’을 다 읽었다는 사실도 즐거웠는데, 사실 책도 꽤나 재미있었다. 재밌는데 원하는 만큼의 속도가 나지 않았던 책.

이 두 책은 독후감도 썼는데, 이게 마지막이었다. 그동안 독후감 쓸 정신도 없이 살았구나.

‘죽기 전까지 걷고 싶다면 스쿼트를 하라’는 정말 딱 그림 6장을 제외하곤 분리수고 해도 좋을 책인데, 여전히 죽기 전까지 걷고 싶은데, 여전히 스쿼트는 안 하고 있다. 무릎을 쓰는 운동은 정말 부담이다. 계속 소리가 나서…

‘Management 3.0’도 매우 좋은 책이다. 이론과 실전을 한 장씩 번갈이 배치했는데, 실전 부분만 계속 읽어보려고 했다(과거형). 나는 동료들과 함께 읽고 싶은 책으로 꼽고 싶다.

‘함께 자라기’는.. 그냥 좋은 책 정도의 느낌만 남았다. 그동안 김창준님 글을 많이 봤던 사람이라면 감흥이 덜 할 수도.

다음에 읽은 ‘마인드셋’도 좋은 이미지가 남았다 정도. 언젠가 애자일 밋업에서 만난 분이 강력 추천했던 책인데, 나는 강력 추천까진 못하고 다만 아내에게 슬쩍 밀어넣어 보긴 했다. 실패. 특별히 기억에 남진 않지만 육아에 있어 좀 더 구체적인 실천 사항이 있는 다른 책과 함께 읽어보면 좋겠다는 생각. 그리고 매니저라면 조직원의 한계를 제한하지 않기 위해 좋은 조언을 들을 수 있을 것으로 기대한다…만 정확히 무슨 내용이었는지는 다시 책을 펼쳐보아야겠다.

‘오브젝트’는 개발 커뮤니티의 기대가 많았던 만큼 수작이 나왔다고 생각한다. 그러나 조영호님의 글쓰기는 나와는 안 맞는다. 함께 봤던 코드스피츠 강의가 정말 좋았다. 주니어에게는 코드스피츠 강의와 함께 할 것을 추천.

‘테크니컬 리더’는 힘든 시절에 많은 도움이 됐던 책이고, 다시 읽어도 꽤나 좋았다. 읽으면서 정리를 해보고 싶다는 생각도 했는데, 타이밍을 놓쳤으니 다음에 또 읽어보는 걸로.

‘도메인주도 설계 핵심’은 DDD 스터디를 진행하기 전에 가볍게 이해도를 높여보고자 읽었던 책. 처음에는 요즘을 잘 설명하는 듯 하다가, 궁금하면 ‘도메인 주도 설계 구현’이라는 책을 보라고 찌르는 책. 같은 저자가 썼다. ‘도메인 주도 설계 구현’이 매우 두껍고 어렵기 때문에 이 책으로 위안을 얻을 수도 있긴 하겠지만, 뭔가 애매한 책이다. 초반 내용은 기획자 직군도 같이 읽으면 좋겠다는 생각도 했다.

기타 요리 관련 책도 좀 사긴 했는데, 정독한 책은 없다. 요즘은 거실에서 다같이 모여 TV를 보거나 소화를 시킬 때, ‘더 푸드 랩’을 종종 펼쳐 보곤 한다. ‘밀가루 물 소금 이스트’와 ‘샐러드가 필요한 모든 순간’은 여전히 끊임없이 펼쳐보는 책이고.

지금까지의 구성

2018년 12월에 고정된 IP를 통과해 Elastic Beanstalk 접근하기라는 글을 썼는데, 올 초에 조금 더 단순하고 안전한 방식으로 변경이 됐다.

기존 방식이 이런 구성이었는데,

Client -> NLB -> Proxy 서버군 -> Elastic Beanstalk

ISMS 심사를 준비하면서 Proxy 서버군에 취약점 조치 사항을 적용하기가 매우 귀찮았다. 보통 우리 회사의 백엔드 서비스는 Elastic Beanstalk나 EKS로 서비스 되기 때문에, Nginx만 단독으로 올려 쓰는 경우가 없어 이를 위해 취약점 조치가 적용된 별도의 AMI를 새로 만들어야 했기 때문. 그것 자체가 큰 어려움이라기 보다는 심사를 위해 신경써야 하는 카테고리가 늘어나는 게 부담이었다.

게다가 인증서를 ACM을 통해 사용하는 게 아니고 회사에서 직접 구매하고 설치한 거라, 올 해 말이면 인증서를 갱신할 시점이 돌아온다. 내가 인증서 관리 역할을 맡은 건 아니라서 이 또한 매우 귀찮다. 그게 나라면 더 귀찮았겠다.

다른 건 거의 매니지드 서비스를 쓰다보니 이 Nginx 서버군의 모니터링도 쉽지 않다. 일단 내가 익숙하지 않고, 아직까지 별 일 없이 동작했지만 상태 모니터링을 띄엄띄엄 하게 된다. 보통은 실제 서비스가 되는 Elastic Beanstalk 기반의 서버에 모니터링이 집중될 수 밖에.

아마도 더 좋은 방법이 있었겠지만, 당시에 내가 고를 수 있었던 최선이었다.

AWS Global Accelerator

사실 이 구성을 고민한 지 얼마 되지 않은 2018년 말에 AWS Global Accelerator가 발표됐었다. 당시에는 이 기능을 자세히 살펴볼 생각도 못했고, AWS에 계신 분(정확히 어떤 직함인지는 여전히 모르겠다만…)과 이야기 했을 때에도 이런 이야기는 없었다.

AWS Global Accelerator 기능 소개를 보면 뭔가 좋은 얘기가 많지만 딱 눈에 띄는 게 있다.

AWS Global Accelerator는 AWS 리전에서 호스팅되는 애플리케이션의 고정 진입점 역할을 하는 하나 이상의 정적 IP 주소를 제공합니다.

Global Accelerator는 전세계 어디서든 사용자가 가장 가까운 엣지 로케이션에 고정된 IP로 접근한 후, 연결된 NLB나 ALB로 이어주는 서비스다. 비록 우리 서버로 접근하는 클라이언트는 대부분 한국 내에 있겠지만.

요금은 대한민국 -> 대한민국 기준으로 0.043 USD/GB라서, 클라이언트와 짧은 페이로드를 주고 받는 입장에서 기존 서버를 내릴 것도 생각하면 부담스러울 것도 없다.

그래서 현재 버전은 아래와 같이 매우 단순해졌다. EB에는 ALB(Application Load Balancer)를 붙였다.

AWS Global Accelerator -> Elastic Beanstalk(+ ALB)

클라이언트에게는 Global Accelerator의 존재가 보이긴 한다.

nslookup 기존도메인

Non-authoritative answer:
Name: 기존도메인
Address: ***.***.***.***
Name: 기존도메인
Address: ***.***.***.***

nslookup 신규도메인

Non-authoritative answer:
신규도메인 canonical name = *****************.awsglobalaccelerator.com.
Name: *****************.awsglobalaccelerator.com
Address: ***.***.***.***
Name: *****************.awsglobalaccelerator.com
Address: ***.***.***.***

어쨌든 그 동안 수고한 NLB와 Proxy 서버들아 안녕.

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

CodeIgniter 4.0

https://github.com/codeigniter4/CodeIgniter4

5년 간의 개발 끝에 새 버전이 릴리스되었습니다. 처음부터 다시 작성하고, PHP 7.2 이상에서 동작하며, PSR-1, 3, 4를 구현했습니다.

PHP 7.4.3

https://www.php.net/ChangeLog-7.php#7.4.3

오래 기다렸던 opcache.preload_user 버그가 수정됐고, 이제는 production에서 사용할 수 있겠습니다.
preload_user 버그란 이걸 말하는 가 봅니다.

Fixed bug #79128 (Preloading segfaults if preload_user is used).

🐘 PHP Internals

Accepted proposals:

아래 세가지 RFC가 승인되었습니다.

[RFC] Variable Syntax Tweaks
[RFC] Static return type
[RFC] Allow ::class on objects

[RFC] Stringable

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

Nicolas Grekas의 제안이 승인됐습니다. 따라서 PHP 8에서는 string|Stringable union type을 쓸 수 있고, __toString()을 구현한 클래스를 인자로 넘길 수 있습니다. 게다가 명시적으로 implements Stringable을 선언하지도 않아도 되는데, __toString()을 구현한 클래스라면 뒤에서 알아서 처리해줍니다.

Language evolution

https://github.com/nikic/php-rfcs/blob/language-evolution/rfcs/0000-language-evolution.md

Nikita가 PHP를 어떻게 legacy code를 깨뜨리지 않으면서 앞으로 나아가게 할 수 있을지 논의를 시작했습니다.
하나의 옵션으로 Rust의 방식처럼 “edition”을 도입하는 것이 있는데, declare(edition=2020)처럼 파일 단위 선언하는 것입니다.

[RFC] Write-Once Properties

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

새로운 property 수정자를 추가하는 제안입니다. 특정 property를 초기화하면 이후 수정할 수 없도록 합니다.
어떤 keyword를 사용할 지 다양한 옵션이 거론되고 있습니다. final, immutable, readonly, writeonce, locked, sealed…

class Foo
{
<keyword> public int $a = 1;
<keyword> public string $b;
<keyword> public array $c = ["foo"];
<keyword> public object $d;

public function __construct()
{
$this->b = "foo";
}
}

$foo = new Foo();

$foo->a = 42; // EXCEPTION: property a has already been initialized
$foo->b = "bar"; // EXCEPTION: property b has already been initialized
$foo->a++; // EXCEPTION: incrementing/decrementing is forbidden
unset($foo->c); // EXCEPTION: unsetting is forbidden
$foo->c[] = "bar"; // EXCEPTION: arrays can't be modified
$var= &$this->c; // EXCEPTION: reference isn't allowed

$foo->d = new Foo(); // SUCCESS: property d hasn't been initialized before
$foo->d->foo = "foo"; // SUCCESS: objects are still mutable internally

[RFC] Allow explicit call-site pass-by-reference annotation

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

호출하는 쪽에서도 reference를 전달한다는 것을 명시적으로 보여줄 수 있도록 제안합니다.
require_explicit_send_by_ref 옵션이 활성화 될 떄만 적용됩니다.

declare(require_explicit_send_by_ref=1);

function byRef(&$ref) {...}
byRef(&$var);

[RFC] Increment/Decrement Fixes

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

경우에 따라 덧셈/뺄셈 연산자가 명시적으로 1을 더하거나 빼는 연산에서 일관되게 동작하지 않는 문제가 있습니다. 예를 들면,

<?php

$a = [];
$a = ++$a; // [] and no errors
$a = $a + 1; // Fatal error

이 RFC는 PHP 8에서 오류를 수정하고 Error를 던질 수 있도록 제안합니다.

[RFC] Attributes v2

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

이 RFC는 <<, >>를 사용해 완전한 어노테이션(annotations)을 추가하기 위한 두번째 시도입니다.

이전에 simple annotationsattributes같은 제안이 있었지만 투표를 통과하진 못했습니다.

use Doctrine\ORM\Mapping as ORM;

<<ORM\Entity(["repositoryClass" => UserRepository::class])>>
<<ORM\Table("users")>>
class User
{
<<ORM\Id, ORM\Column, ORM\GeneratedValue>>
public int $id;

<<ORM\Column(["unique" => true])>>
public string $email;

<<ORM\ManyToOne()>>
public ?Address $address;
}

[PR] Make sorting stable

https://github.com/php/php-src/pull/5236

PHP의 정렬 함수는 안정되지 않았습니다(not stable). 같은 값을 가진 요소들의 원래 순서가 보장되지 않습니다. 예를 들면, 이렇습니다.

이를 고치자는 제안이 올라왔습니다만, 동일한 요소가 여럿 포함될 경우 성능에 영향을 줄 것입니다.

🛠 Tools

T-Regx/T-Regx

https://github.com/T-Regx/T-Regx

사용자 친화적인 인터페이스로 정규식을 작업하기 좋은 패키지입니다.

spiral/RoadRunner

https://github.com/spiral/roadrunner

Golang으로 만들어진 PHP Application Server입니다. 이제 file watcher가 포함되어, 워커가 자동으로 갱신될 수 있습니다.

tightenco/overload

https://github.com/tightenco/overload

closure의 모음을 통해 overloading method를 구현한 간단하지만 흥미로운 구현체입니다.

cmorrell.com/php-fpm

https://cmorrell.com/php-fpm/

php-fpm 설정을 생성하는 좋은 툴.

minicli/minicli

https://github.com/minicli/minicli

CLI 중심의 PHP 애플리케이션을 생성하기 위한, 의존성이 없이 Vanilla PHP로 만들어진 도구입니다.

minicli를 소개하는 4개의 연재를 확인하세요.

shivammathur/setup-php

https://github.com/shivammathur/setup-php

PHP 환경을 설정해서 당신의 workflow의 기반으로 사용할 수 있게 도와주는 Github Action입니다.

GitHub action to setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer

Symfony

📺 Charming Development in Symfony 5

https://symfonycasts.com/screencast/symfony

SymfonyCasts에서 진행중인 시리즈입니다.

Auto-configuration of Doctrine repositories as services

https://www.strangebuzz.com/en/blog/auto-configuration-of-doctrine-repositories-as-services

A Week of Symfony #688 (2-8 March 2020)

https://symfony.com/blog/a-week-of-symfony-688-2-8-march-2020

Laravel

Laravel 7

https://laravel.com/docs/7.x/releases

이번 릴리스에선,

  • laravel/airlock – SPA에서의 인증을 위한 새로운 component
  • Custom Eloquent Casts – 어떻게 사용하는 지는 이 tutorial을 보세요!
  • Blade component가 이제 클래스와 custom HTML 태그로 선언될 수 있고 @component 태그 대신 사용할 수 있습니다
  • HTTP Client – 일반적인 작업을 위해 단순한 인터페이스를 가진 Guzzle wrapper입니다. kitetail/zttp를 기반으로 합니다.

어떤 점이 새로워졌는지 📺 Laracasts와 📺 Coder’s Tape channel에서 동영상 overview로 확인해보실 수 있습니다.

Livewire v1.0

https://github.com/livewire/livewire

이 Laravel을 위한 frontend framework은 추가적인 JS 코드 없이도 Blade를 PHP class로 바인딩 해줄 수 있습니다. 이 📺 video tutorial에서 form을 처리하는 방식을 확인하실 수 있어요.

nunomaduro/laravel-mojito

https://github.com/nunomaduro/laravel-mojito

독립적으로 뷰를 테스트할 수 있는 간단한 패키지입니다. 어떻게 사용하는지 이 📺 demo를 보고 확인하세요.

Optimizing circular relationships in Laravel

https://reinink.ca/articles/optimizing-circular-relationships-in-laravel

Laravel에서 양방향 relation을 최적화하는 방법입니다.

📺 How to write exceptionally good exceptions in PHP.

https://freek.dev/1582-how-to-write-exceptionally-good-exceptions-in-php

🔈 Laravel Snippet #23: Laravel 7.x, Forge, Vapor, Speaking vs. Silence.

https://blog.laravel.com/laravel-snippet-23-laravel-7x-forge-vapor-speaking-vs-silence

📺 Laracon Australia 2019 videos.

https://www.youtube.com/playlist?list=PLEkJYA4gJb78lIOKjZ0tJ9rWszT6uCTJH

Yii

Yii news 2020, issue 2

https://opencollective.com/yiisoft/updates/yii-news-2020-issue-2

Yii 3에 반영된 많은 변화를 포함한 뉴스입니다.

yiisoft/friendly-exception

https://github.com/yiisoft/friendly-exception

Yii 3이 릴리스된 후 첫 패키지입니다. 사람이 읽을 수 있는 exception을 선언할 수 있는 인터페이스를 제공합니다.

Zend/Laminas

Inaugural Technical Steering Committee Meeting

https://getlaminas.org/blog/2020-03-05-tsc-inaugural-meeting.html

Laminas의 개발 및 자금 조달 계획에 대해 알 수 있습니다.

🌀 Async PHP

📺 Interview with Marc Morera

https://www.youtube.com/watch?v=bekZ7cPmSuE

DriftPHP의 저자와 driftphp/reactphp-dbal에 관해 이야기 합니다.

driftphp/tiny-load-balancer

https://github.com/driftphp/tiny-load-balancer

ReactPHP 위애서 도는 아주 작은 로드밸런서입니다.

💡 기타 읽을 만한 글

Understanding PHP 8’s JIT

https://thephp.website/en/issue/php-8-jit/

PHP 8의 JIT 이해하기

When does PHP call __destruct()?

https://dev.to/themsaid/when-does-php-call-destruct-1167

__destruct()가 언제 호출되는지 설명합니다.

Bitwise booleans in PHP

https://stitcher.io/blog/bitwise-booleans-in-php

저자가 PHP의 Enum type의 지원없이 Enum을 구현하는 이전 포스트에서 bool flag를 저장하는 것을 보여줬었는데, 이번에는 bitmask를 사용하여 bool flag를 저장하는 방식을 설명합니다.

PHPUnit: A Security Risk?

https://thephp.cc/news/2020/02/phpunit-a-security-risk

vendor 디렉토리가 공개적으로 접근 가능하다면, PHPUnit의 이전 버전이 어떤 보안 문제를 일으키는지 알아보세요.

여기서 얻은 교훈으로는

  • Composer로 관리되는 vendor 디렉토리는 공개적으로 접근 가능해선 안 된다
  • PHPUnit과 같은 개발 단계에서 필요한 라이브러리는 production에 배포되어선 안 된다

PHPUnit 문서에서도 이를 명확히 경고하고 있습니다.

PHPUnit is a framework for writing as well as a commandline tool for running tests. Writing and running tests is a development-time activity. There is no reason why PHPUnit should be installed on a webserver. If you upload PHPUnit to a webserver then your deployment process is broken. On a more general note, if your vendor directory is publicly accessible on your webserver then your deployment process is also broken. Please note that if you upload PHPUnit to a webserver “bad things” may happen. You have been warned.

How @miguelxpn found a bug in PHP’s standard library and fixed it.

https://www.miguelxpn.com/coding/php/opensource/2020/03/01/how-i-found-and-fixed-a-bug-in-php-std-lib.html

Miguel Xavier Penha Neto란 사람이 PHP 표준 라이브러리의 버그고쳤다는 이야기.

Clean Code and Object Calisthenics Rules

https://beberlei.de/2020/02/25/clean_code_object_calisthenics_rules_i_try_to_follow.html

Benjamin Eberlei란 사람이 지키려고 하는 Clean Code / 객체 관리 규칙을 소개합니다.

  • A strict coding style
  • A static code analyzer, but not at highest level
  • Take very good care of API Information Hiding and Encapsulation
  • To new or not to new
  • Separate Statements and Declartions by empty lines
  • Use early exits and don’t use else
  • Only one level of indentation per method and a second for early exits
  • Don’t abbreviate names (too much)
  • Prefer Null Coalesce Operator over if isset
  • Don’t allow a variable to have two types
  • Don’t re-use a variable with a different type
  • Typehint Collection Items with assert
  • Use structs to wrap arrays (especially from SQL results)

📺 Videos

📺 What’s coming in PhpStorm 2020.1 – Every week we publish a new 5-minute video.

https://www.youtube.com/playlist?list=PLQ176FUIyIUb7qSArPCxOkIGX-cqdfoBx

📺 PHP Tutorial for Absolute Beginners – PHP Course 2020 – 5 hours of video tutorials.

https://www.youtube.com/watch?v=yXzWfZ4N4xU

🔈 Podcasts

PHP Internals News

The Undercover ElePHPant

Voices of the ElePHPant with Sara Golemon and Derick Rethans

https://voicesoftheelephpant.com/2020/02/26/interview-with-sara-golemon-derick-rethans/

a discussion of various updates in PHP 8.

Php_annotated_monthly 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated 2020년 2월호의 번역본입니다.

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


⚡️ News & Releases

PhpStorm 2020.1 EAP started

https://blog.jetbrains.com/phpstorm/2020/01/phpstorm-2020-1-early-access-program-is-now-open/

PhpStorm 2020.1 EAP 프로그램이 시작됐습니다. 아래와 같은 개선이 있었습니다.

  1. Composer support

프로젝트에 composer.json이 존재하는 PhpStorm 유저의 20% 만이 PHP composer.​json support를 설치했다고 합니다.

PhpStorm team이 이를 새로 개발할 수 있게 플러그인 개발자인 Piotr Śliwa에 연락했습니다. 이번에 개선된 기능은,

  • 우클릭으로 프로젝트에 composer.json을 만들기
  • 새 composer.json 템플릿 수정 기능
  • composer.json 안에 라이센스와 최소 안정화 버전을 쉽게 지정
  • 설치 가능한 PHP와 모듈, 의존성 라이브러리의 이름이나 버전을 제안하는 기능
  • 패키지의 업데이트/설치 지원
  • 이름을 클릭하면 project tree의 vendor에서 해당 위치로 이동
  • Autoload 영역 자동 완성
  • scripts 영역에 command 추가 가능 & 실행 가능
  1. krakjoe/pcov를 활용한 Code Coverage 측정

  2. Customize Lexer Syntax for Twig

  3. 그리고 모든 JetBrains IDE에 적용되는 개선 사항

  • JetBrains Mono 폰트 추가
  • 개선된 Interactively Rebase from Here dialog
  • IntelliJ Light 테마
  • Quick documentation popup이 mouseover로 동작

새로운 소식이나 비디오 시리즈를 빨리 받고 싶으시면 @phpstorm를 팔로우하거나 유튜브에서 JetBrainsTV를 구독하시면 됩니다.
What’s Coming in PhpStorm 2020.1이라는 시리즈를 만들었답니다. 📺 Episode 1이 올라왔습니다.

[Internal] Election results

https://groups.google.com/forum/#!topic/php-fig/M_Np9Gh9Omc

PHP-FIG에서 선거가 있었다는 소식

🐘 PHP Internals

[RFC] Allow function calls in constant expressions

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

현재 PHP 버전에서는 상수 선언에서 리터럴이나 제한된 연산만을 허용하는데, 여기서는 상수 선언이나 static property, static 변수, 함수 파라미터에서 global 함수를 쓸 수 있게 제안합니다.

class MyClass {
const VALUES = [1, 0];
const C1 = count(self::VALUES);

public static $p = count(self::VALUES);

public function foo($param = count(self::VALUES))
{
static $bar = count(self::VALUES);
}
}

[RFC] __toArray()

https://wiki.php.net/rfc/to-array

새로운 magic method __toArray()를 제안합니다.

class Person
{
protected $name;
protected $email;
public function __toArray()
{
return [
'name' => $this->name,
'email' => $this->email,
];
}
}

$person = new Person('John Doe', 'j.doe@example.com');

$personArray = (array) $person; // Calls __toArray()

function foo(array $person) {
var_dump($person); // Array here
}

function bar(Person $person): array {
return $person;
}

var_dump(bar($person)); // and here it's an array

[RFC] Userspace operator overloading

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

Python, C#, C++에서와 같이 연산자 오버로딩을 허용하자는 제안입니다. 이미 PHP의 내부 메커니즘은 이를 지원할 수 있게 되어있다는 군요. 아직 RFC는 draft 상태이지만, Internals 내부에서는 활발히 논의되고 있습니다.

lisachenko/z-engine를 활용해 PHP 7.4의 FFI로 미리 체험 해보실 수 있습니다.

[RFC] Validation for abstract trait methods

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

Trait의 추상 메소드를 구현할 때는 타입 체크를 하지 않는데, 예를 들어 아래 코드는 에러 없이 실행됩니다.

trait T {
abstract public function test(int $x);
}

class C {
use T;

// It works now, but it shouldn't because of a type mismatch
public function test(string $x) {}
}

이를 바로 잡는 제안이 올라왔습니다. 다만 해당 PR에 하위호환을 해치는 코드가 있어 RFC 프로세스가 계속 진행 중입니다.

[RFC] Server-Side Request and Response Objects v2

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

$_GET, $_POST, $_SERVER 같은 superglobal 배열을 ServerRequest라는 클래스로 대체하자는 제안입니다.
header()를 사용하는 곳에선 ServerResponse 클래스로 대체합니다.

Generics in PHP

최근 Nikita Popov가 PHP에 generics를 넣기 위한 연구를 진행하고 있습니다. 몇가지 심각한 어려움도 있고, PHP에 완전한 generics를 도입하는 것이 좋은 생각일지 확신이 서지 않는다고 합니다.

Prototype 구현은 pull request이 올라와 있고, 모든 문제점과 의문은 이 곳에서 확인하실 수 있습니다 : https://github.com/PHPGenerics/php-generics-rfc/issues/45

php/doc-en

https://github.com/php/doc-en

영어 documentation은 GitHub에서 pull-request를 통해 수정할 수 있습니다. 기존에는 edit.php.net에서 했어야 했죠.

🛠 Tools

PHPUnit 9

https://phpunit.de/announcements/phpunit-9.html

PHP 7.3+ 이상을 요구하는 PHPUnit 9이 릴리스됐습니다. 하위 호환이 깨지는 변경 사항도 있습니다. migration instruction를 읽어보세요.

cycle/orm 1.2

https://github.com/cycle/orm

DataMapper로 혹은 ActiveRecord로도 사용할 수 있는 ORM인데, benchmarks에서 성능이 33%나 개선되어 가장 빠른 ORM 중 하나가 됐습니다.

lisachenko/z-engine

https://github.com/lisachenko/z-engine#abstract-syntax-tree-api

위에서 언급됐던, 실험적 성격의 라이브러리입니다.

FFI를 사용해서 PHP 내부 구조에 접근할 수 있게 해줍니다. 이를 사용하는 예제로 immutable objects, 즉석에서 AST를 변경 등이 있습니다.

salsify/jsonstreamingparser

https://github.com/salsify/jsonstreamingparser

아주 큰 JSON 문서를 한번에 읽어들이지 않고 스트림으로 받아 파싱하는 라이브러리입니다.

spatie/docker

https://github.com/spatie/docker

PHP로 Docker container를 관리할 수 있습니다. 블로그 Manage Docker containers using PHP를 읽어보세요.

symfony/polyfill-php80

https://github.com/symfony/polyfill-php80

PHP 8.0 polyfill입니다.

BenMorel/weakmap-polyfill

https://github.com/BenMorel/weakmap-polyfill

PHP 7.4를 위한 WeakMap polyfill입니다.

paratestphp/paratest

https://github.com/paratestphp/paratest

PHPUnit 9와 호환되는 PHPUnit을 병렬로 실행해주는 도구입니다.

Symfony

A story of finding performance issues in a Symfony application

https://jolicode.com/blog/battle-log-a-deep-dive-in-symfony-stack-in-search-of-optimizations-1-n
https://jolicode.com/blog/battle-log-a-deep-dive-in-symfony-stack-in-search-of-optimizations-2-n

Symfony application에서 성능 문제를 찾아가는 여정

Grant on permissions, not roles

https://wouterj.nl/2020/01/grant-on-permissions-not-roles

권한 부여를 role에 하지 말고 voter를 활용하라는 이야기

A Week of Symfony #684 (February 3-9, 2020).

https://symfony.com/blog/a-week-of-symfony-684-3-9-february-2020

Laravel

pavel-mironchik/laravel-backup-panel

https://github.com/pavel-mironchik/laravel-backup-panel

spatie/laravel-backup의 웹 인터페이스. 브라우저에서 백업을 관리할 수 있습니다.

avto-dev/roadrunner-laravel

https://github.com/avto-dev/roadrunner-laravel

새로운 버전의 RoadRunner worker. RoadRunner와 Laravel applications을 쉽게 연결 해줍니다.

laravelpackage.com

https://laravelpackage.com/

라라벨 패키지를 만들기 위한 자세한 가이드.

Authentication and Laravel Airlock

laravel/airlock을 사용한 인증

Containerizing Laravel 6 application

https://www.digitalocean.com/community/tutorials/containerizing-a-laravel-6-application-for-development-with-docker-compose-on-ubuntu-18-04

for development with Docker Compose and Ubuntu 18.04.

How to use mixins in Laravel.

https://liamhammett.com/laravel-mixins-KEzjmLrx

Laravel에서 mixin은 어떻게 만드는가.

Laravel beyond CRUD

https://stitcher.io/laravel-beyond-crud

Laravel beyond CRUD라는 시리즈입니다. 현재 09. Test factories까지 발표됐습니다.

  1. Domain oriented Laravel
  2. Working with data
  3. Actions
  4. Models
  5. States
  6. Managing domains
  7. Entering the application layer
  8. View models
  9. Test factories

📺 Tips for simplifying Laravel controllers.

https://laracasts.com/series/guest-spotlight/episodes/5

guest-spotlight라는 라라캐스트 무료 강좌 시리즈 중 controller를 가볍게 만드는 법.

🔈 Taylor’s podcast: Laravel Snippet #22

https://blog.laravel.com/laravel-snippet-22-laracon-online-inertiajs-livewire-spas-reviewing-the-day

Laracon Online, Inertia.js, Livewire, SPAs, Reviewing The Day.

Zend/Laminas

The last post in Zend Framework blog

https://framework.zend.com/blog/2020-01-24-laminas-launch

Zend Framework blog의 마지막 글이 올라왔습니다. 이제 완전히 Laminas로 이전했습니다.

Async PHP

📺 Interview with Marc Morera

https://www.youtube.com/watch?v=uebhqc2BZXw

An author of DriftPHP, about asynchronous PHP, DriftPHP and ReactPHP.

driftphp/awesome-reactphp

https://github.com/driftphp/awesome-reactphp

ReactPHP판 awesome 시리즈.

기타 읽을 만한 글

PHP in 2020

https://stitcher.io/blog/php-in-2020

An overview of the language and ecosystem state.

New in PHP 8.

https://stitcher.io/blog/new-in-php-8

2020년 말 릴리스 될 것으로 예상되는 PHP8에 새로운 기능을 소개합니다.

Enums without enums in PHP

https://stitcher.io/blog/enums-without-enums

익명 클래스로 enum을 흉내냅니다.

Type matching in PHP

https://steemit.com/php/@crell/type-matching-in-php

Rust의 match construct를 PHP에서 arrow 함수로 구현했습니다.

My PhpStorm settings after 8 years of use.

https://stefanbauer.me/articles/my-phpstorm-settings-after-8-years-of-use

8년 동안 PhpStorm을 사용한 누군가의 세팅.

Modern PHPDoc Annotations for arrays

https://suckup.de/2020/02/modern-phpdoc-annotations/

PhpStorm에서 배열을 위한 annotation 작성법. PhpStorm에선 deep-assoc-completion plugin을 사용할 것을 권장합니다.

Benchmark of PHP 7.4 preloading

https://developer.happyr.com/php-74-preload

Symfony application에서의 벤치마킹 자료입니다. 성능 향상이 꽤 있습니다.

A history of optimizing the performance of a monolith app

https://medium.com/pipedrive-engineering/how-two-developers-accelerated-php-monolith-in-pipedrive-df8a18bc2d8a

Blackfire.io로 측정해가면서, PHP monolith 어플리케이션을 개선해나가는 과정을 보여줍니다.

On aspect-oriented programming

https://medium.com/@ivastly/application-instrumentation-with-aspect-oriented-programming-in-php-18b1defa682

Go!AOP로 PHP에서 AOP를 도입하는 예시를 소개합니다.

Redux in 30 lines of PHP.

https://sorin.live/redux-in-50-lines-of-php/

30줄로 Redux 구현하기.

An anonymous researcher published exploits

https://github.com/mm0r1/exploits

익명의 제보자가 disable_functions 옵션을 처리하는 과정에서의 취약성을 보고했습니다. 여기서 더 자세히 알아보세요.

Videos

🔈 Podcasts

Php_annotated_monthly 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated 2020년 1월호의 번역본입니다.

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


⚡️ News & Releases

CakePHP 4.0

https://bakery.cakephp.org/2019/12/15/cakephp_400_released.html

최소 PHP 사양이 PHP 5.6에서 PHP 7.2로 올랐습니다. PSR standard (3, 15, 16, 18)을 지원하고 많은 개선 사항이 있었습니다.

Codeception 4.0

https://codeception.com/12-18-2019/codeception-4

모든 모듈이 분리된 패키지로 추출되었습니다. Symfony 5와 phpdotenv 4 지원, 그리고 upgrade script를 제공합니다.

Phalcon 4.0

https://blog.phalcon.io/post/phalcon-4-0-0-released

C로 구현되고 PHP 확장으로 배포되는 이 프레임워크에 메이저 업데이트가 있었습니다. PHP 7.2 이상을 요구하고 PSR standard (7, 11, 13, 16, 17) 추가 지원하며 interfaces는 더 엄격해졌습니다. upgrade guide에서 더 많은 변경점을 확인하세요.

PHP 7.2.26

https://www.php.net/ChangeLog-7.php#7.2.26

PHP 7.2 branch에서 마지막 정규 bugfix 릴리스입니다. 올 해까지 필요할 경우 security fix 정도만 업데이트 되고 끝입니다.

PHP IMAP extension will no longer work with Gmail OAuth

https://github.com/google/gmail-oauth2-tools/issues/18

Gmail OAuth가 SASL XOAUTH2 protocol을 지원하지 않게 되면서 PHP IMAP extension은 더이상 사용하지 않는다고 합니다. 이 extension을 사용할 가능성도 거의 없다고 하는군요. 이 extension은 어차피 PHP 8에서 제거될 운명입니다.

laminas/laminas-mail 혹은 PHP IMAP과 거의 동일한 함수를 제공하는 Zend Mail의 wrapper인 freescout-helpdesk/ximap를 추천한다고 합니다.

🐘 PHP Internals

[RFC] Weak maps

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

이 제안이 accept 됐고, PHP 8 branch에 머지되었습니다.

[RFC] Variable Syntax Tweaks

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

이 RFC는 Uniform Variable Syntax RFC의 범위 중 PHP 7에서 다루지 않은 역 참조와 관련된 일부 불일치를 수정하도록 제안합니다.

[RFC] Static return type

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

static 키워드는 late static binding을 제공하는 타입 선언 방식입니다. 이 RFC는 return type에도 static 키워드를 쓸 수 있게 허용할 것을 제안합니다. 이미 self나 parent는 가능합니다.

이를 사용하면 static 생성자나 fluent interface를 구현하는데 도움이 될 수 있다고 합니다.

class Test {
public function createFromWhatever($whatever): static {
return new static($whatever);
}
}
class Test {
public function withWhatever($whatever): static {
$clone = clone $this;
$clone->whatever = $whatever;
return $clone;
}
}

[RFC] Allow ::class on objects

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

PHP8을 목표로 클래스 인스턴스로부터 fully qualified name을 얻을 수 있게 허용하는 제안이 올라왔습니다. 우리가 Foo\Bar::class처럼 사용하는 것과 같이 $object::class를 쓸 수 있게 말이죠.

[RFC] “use global functions/consts” statement

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

함수나 상수(const)에 prefix가 없으면 우선 현재 namespace를 기준으로 찾고 이후에 전역 namespace를 뒤지는데, 제안자는 use global function 혹은 use global consts을 쓰면 전역을 먼저 확인할 것을 제안합니다.


pull-requests를 통한 변화도 있을 수 있습니다.

[PR] Deprecate required param after optional

https://github.com/php/php-src/pull/5067

이 PR은 함수 signature에서 비 필수 파라미터가 필수 파라미터 앞에 위치할 경우 deprecation notice를 생성합니다.

[PR] Check abstract method signatures coming from traits

https://github.com/php/php-src/pull/5068

trait의 abstract 메소드는 그걸 사용하는 측 클래스에서 유효성 검증을 하지 않습니다. 아래 코드는 에러 없이 실행 가능합니다.

trait T {
abstract function neededByTheTrait(int $a, string $b);
}
class C {
use T;
function neededByTheTrait(array $a, object $b) {}
}

[PR] Ensure correct signatures for PHP magic methods

https://github.com/php/php-src/pull/4177

magic method의 signature를 검사하자는 PR.

[PR] Add Stringable interface

https://github.com/php/php-src/pull/5083

이 PR은 새로운 인터페이스인 Stringable를 제안합니다. 이 제안으로 PHP 8에서 도입된 Union Type을 통해 string|Stringable와 같이 선언하면 __toString()을 구현하고 있는 문자열이나 객체 모두 받아들일 수 있게 됩니다.

🛠 Tools

DarkGhostHunter/Preloader

https://github.com/DarkGhostHunter/Preloader

이 툴은 사용 통계에 기반해 PHP 7.4의 preloading을 위한 파일을 선택하고 자동으로 preloader script를 생성할 수 있게 도와줍니다.

nikic/PHP-Fuzzer

https://github.com/nikic/PHP-Fuzzer

Nikita Popov가 만든 실험적인 PHP 패키지입니다. 무작위 입력 데이터를 생성해줍니다.

lukanetconsult/network-address-types

https://github.com/lukanetconsult/network-address-types

Network Address Types을 구분해주는 라이브러리

krakjoe/pthreads

https://github.com/krakjoe/pthreads

PHP에서 multithread를 지원하는, 한 때 인기였던 extension이 아카이빙 됐습니다. 대신 krakjoe/parallel를 사용하세요.

php-service-bus/service-bus

https://github.com/php-service-bus/service-bus

Amphp에 기반한 프레임웍. Saga, CQRS, EventSourcing, and Message Bus 패턴을 사용하는 어플리케이션을 위한 프레임웍입니다.

franzliedke/studio

https://github.com/franzliedke/studio

Composer 패키지를 사용하는 동시에 개발할 수 있게 도와줍니다.

Symfony

A cheat sheet on the Messenger component.

http://assets.andreiabohner.org/symfony/sf44-messenger-cheat-sheet.pdf

Messenger component에 관해 매우 (개발자 눈에는) 예쁘고 친절하게 표현 해놓았습니다.

Symfony was the backend framework with the most contributors in 2019.

https://symfony.com/blog/symfony-was-the-backend-framework-with-the-most-contributors-in-2019

Symfony가 2019년에 다른 백엔드 프레임웍 중에 가장 많은 기여자 수를 기록했다고 합니다.

Symfony 2010s decade in review.

https://symfony.com/blog/symfony-2010s-decade-in-review

Symfony가 10년 간 걸어온 길

A week of Symfony #680 (6-12 January 2020)

https://symfony.com/blog/a-week-of-symfony-680-6-12-january-2020

Laravel

Laravel Idea

https://plugins.jetbrains.com/plugin/13441-laravel-idea/

Laravel plugin이 오랫동안 PhpStorm 용 플러그인으로 사용됐지만, 최근 몇년 간은 활발히 개발이 되진 않았습니다. 그 대안으로 Laravel plugin이 있습니다. 무료는 아니지만 몇가지 추가 기능이 있습니다.

.env files support로 알려진 Adel F“Architecture of complex web applications”의 저자이기도 합니다.

laravel/airlock

https://github.com/laravel/airlock

Taylor Otwell이 개발한 SPA나 API에서 쉽게 인증하기 위한 패키지의 초기 버전입니다. 이를 소개하는 포스트를 확인해보세요.

Using GitHub actions to run the tests of Laravel projects and packages

https://freek.dev/1546-using-github-actions-to-run-the-tests-of-laravel-projects-and-packages

GitHub actions로 Laravel project와 package를 다른 PHP 버전과 다른 의존성으로 테스트하는 방법입니다.

📺 Building filters using spatie/laravel-query-builder.

https://freek.dev/1534-building-filters-using-laravel-query-builder

📺 How to avoid large function signatures by using pending objects

https://freek.dev/1545-how-to-avoid-large-function-signatures-by-using-pending-objects

🔈 Laravel Snippet #20 – Union Types, SPA Authentication, Laravel UI, Middleware Priority, Laracon 2020.

https://blog.laravel.com/laravel-snippet-20-union-types-spa-authentication-laravel-ui-middleware-priority-laracon-2020

🔈 Laravel Snippet #21 – Artisan Inspire, Vapor multi-domain support, Laravel Airlock.

https://blog.laravel.com/laravel-snippet-21-artisan-inspire-vapor-multi-domain-support-laravel-airlock

Zend/Laminas

A new project for a new year

https://getlaminas.org/blog/2019-12-31-out-with-the-old-in-with-the-new.html

Zend Framework에서 여러 Laminas 프로젝트로의 마이그레이션이 마무리 됐다는 소식입니다.

Yii

Yii 1, Yii 2.0.31 and Yii 3 progress.

https://opencollective.com/yiisoft/updates/yii-1-yii-2-0-31-and-yii-3-progress

🌀 Async PHP

📺 Screencast on DriftPHP

https://www.youtube.com/watch?v=2-Id0dc1ZZk

ReactPHP Symfony components를 기반으로 한 비동기 PHP 프레임웍인 DriftPHP에 관한 Screencast입니다.

amphp/http-client 4.0

https://github.com/amphp/http-client

Amphp의 HTTP client가 HTTP/2를 완전히 지원한다는 소식. 게다가 PHP 7.4를 사용한다면 FFI를 이용한 nghttp2를 설치할 수 있다고 합니다.

기타 읽을 만한 글

Rules for working with dynamic arrays and custom collection classes.

https://matthiasnoback.nl/2020/01/rules-for-working-with-arrays-and-custom-collection-classes-in-php/

PHP에서 dynamic array를 다루거나 custom collection 클래스를 만들어 사용하는 데 있어 저자가 사용하는 몇 가지 규칙을 Style guide로써 제시합니다.

Hashing passwords on the server-side, a dead end?

https://blog.usejournal.com/hashing-passwords-on-the-server-side-a-dead-end-82669ee0253a

Nicolas Grekas는 우리가 우리 스스로 서버를 서비스 거부 공격에 취약하게 만들 것인지 묻습니다.

요즘은 bcrypt가 대세이지만, 이런 알고리즘은 CPU 기준으로 비용이 계산됩니다. 결국 CPU 성능만 높이면 결국 “충분히” 취약해질 수 있다고 합니다. 그 대안으로 나온 것 중에는 Argon2를 추천합니다.

그런데 이 배경 때문에 서비스 거부 공격에 취약한데, 이에 관한 대안을 제시합니다.

How to break an entire ecosystem by publishing a release

https://medium.com/@alcaeus/how-to-break-an-entire-ecosystem-by-publishing-a-release-b6aaab2b8aaa

doctrine/persistence를 엄격한 타입 기반 API로 업그레이드 해가는 과정과 여기서 실수했던 부분을 공유합니다.

저자가 소개하는 How to deprecate a type in PHP도 추천합니다.

How to Develop and Debug PHP Applications in Kubernetes.

https://okteto.com/blog/how-to-develop-php-apps-in-kubernetes/

Benchmarks of PHP 5.6 – 7.4

https://kinsta.com/blog/php-benchmarks/

with WordPress, Drupal, Magento 2, Laravel, Symfony, and others (without preloading).

아주 큰 변화는 없지만 모든 테스트에서 조금은 개선된 걸 보실 수 있습니다. PHP 7.4에서 소개된 preloading은 설정하지 않은 수치입니다.

PHP 7.4 Preloading benchmarks with Laravel.

Preloading을 설정한 Laravel 벤치마크 자료입니다.

📺 Videos

📺 How to upgrade to PHP 7.4 with PhpStorm

https://www.youtube.com/watch?v=ia1KSZCG2Bs

PhpStorm를 통해 9 분 동안의 Alt+EnterSSR 트릭으로 PHP 7.4로 업데이트 하기.

📺 How to Run PHPUnit Tests Using PhpStorm

https://www.youtube.com/watch?v=7YnYz_SjVbI

관련 포스트도 읽어보세요.

📺 Refactor complex conditionals.

https://vimeo.com/381650670

📺 Single Responsibility principle (SOLID)

https://www.youtube.com/watch?v=Q61TtJlWvfE

by Anna Filina.

🔈 Podcasts

🔈 The Undercover ElePHPant #5

https://undercover-elephpant.com/episodes/integrating-with-third-party-apis-with-nils-adermann

Nils Adermann(Composer)와 함께 하는 Third-Party API 연동. 관련 포스트를 참고하세요.

🔈 The Undercover ElePHPant #4

https://undercover-elephpant.com/episodes/retries-and-timeouts-with-bastian-hofmann

how to handle retries and timeouts in PHP with Bastian Hofmann.

Php_annotated_monthly 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated 2019년 12월호의 번역본입니다.

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


⚡️ News & Releases

PHP 7.4.0

https://www.php.net/releases/7_4_0.php

오랫동안 기다렸던 새로운 인터프리터가 예정대로 릴리스 됐습니다. Release manager인 Derick RethansPeter Kokot에게 깊은 감사를 표합니다.

주목할 만한 변화는 아래와 같습니다.

전체 변경 사항은 php-src/UPGRADING에서 확인하시면 됩니다.

Benchmarks에 따르면, preloading 없이 약 11%까지 성능이 향상 됐습니다.

7.4의 릴리스로 PHP 7.1의 지원도 끝났습니다. PHP 7.2는 12월 19일 마지막 정규 업데이트 앞두고 있으며, 이후 2020년 12월까지는 보안 수정 사항만 있을 것입니다. 그러니 지금이 업그레이드하기 좋은 시점입니다. - 여러 환경에서 업그레이드 하는 방법

Updating PSR standards

https://github.com/php-fig/fig-standards/pull/1195/files?short_path=ef021a0#diff-ef021a0820876c95b7b6ec1d4007fe75

10월 php annotated에서 PSR 표준을 업데이트 하는 방법을 고민 중이라는 소식을 전해드렸는데요. 투표가 끝났답니다. 두 단계로 업데이트 하는 계획이 선택됐습니다.: 모든 표준은 우선 v1.1로 업데이트 되면서 파라미터에 대한 타입 정의를 하게 되고, 이후 v2.0에서 리턴값 타입 힌트가 들어갑니다. 이와 같이 진행되는 이유는 여기서 확인하세요. (10월 php annotated에서 보셔도 좋습니다)

WordPress 5.3

https://wordpress.org/news/2019/11/kirk/

WordPress 5.3 “Kirk”가 소개됐습니다. Gutenberg라는 새로운 에디터(그나저나 Laravel에서도 사용할 수 있다는군요: VanOns/laraberg), “Twenty Twenty”라는 테마가 추가됐고, PHP 7.4 호환이 됩니다.

Drupal 8.8.0

https://www.drupal.org/blog/drupal-8-8-0

다른 무엇보다도 Composer를 Native로 지원한다고 합니다. Drupal을 설정하는데 third-party 프로젝트에 의존하지 않고 Composer를 사용하시면 됩니다.

PhpStorm 2019.3

https://blog.jetbrains.com/phpstorm/2019/11/phpstorm-2019-3-release/

Full PHP 7.4 Support, PSR-12, WSL, MongoDB, and more.

Xdebug 2.9.0

https://xdebug.org/announcements/2019-12-09

Xdebug 2.7에 비해 code coverage 속도가 250% 향상되었습니다. 전체 소식를 확인해보세요.

PHP versions statistics – 2019.2

https://blog.packagist.com/php-versions-stats-2019-2-edition/

Composer가 packagist.org에 연결할 때 보내는 데이터에 기반한 통계입니다. 새로운 버전이 꽤 빠르게 적용되고 있는데, PHP 7.3이 35.24% 정도 점유하고 있고, PHP 5는 9% 정도로 느리지만 감소하고 있습니다.

🐘 PHP Internals

[RFC] Weak maps

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

PHP 7.4는 WeakReference라는 특별한 클래스를 통해 weak refs를 지원합니다. 그러나 real-world 어플리케이션에서는, 개발자들은 WeakMap 같은 걸 원하겠죠. 그러나 현재의 WeakReference로는 구현할 수가 없습니다. 그래서 이 RFC에서 한가지 추가됐습니다.

$map = new WeakMap();
$obj = new stdClass();
$map[$obj] = 42;
var_dump($map);
// object(WeakMap)#1 (1) {
// [0]=>
// ["key"] => object(stdClass)#2 (0) {}
// ["value"] => int(42)
// }
// }

// The object is destroyed here, and the key is automatically removed from the weak map.
unset($obj);
var_dump($map);
// object(WeakMap)#1 (0) {
// }

[RFC] Implement new DOM Living Standard APIs in ext/dom

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

PHP core extension인 ext/DOM에 DOM Living Standard를 반영하자는 제안이 만장일치로 accepted 됐습니다.

[RFC] Union Types 2.0

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

Union Types 2.0이 accepted 되어 8.0에 반영됩니다. 파라미터, 리턴 타입, 프로퍼티 등 티입을 쓸 수 있는 곳에 사용할 수 있습니다.

🛠 Tools

Infection 0.15.0

https://infection.github.io/2019/09/29/whats-new-in-0.15.0/

Update for mutation testing tool in PHP. In this release: Codeception support, PHP 7.4, Symfony 4.4 and 5.0, a couple of new mutators.

lisachenko/z-engine

https://github.com/lisachenko/z-engine

FFI의 도움으로 zend_class_entry, zval 등 PHP의 내부 구조에 접근하고 수정할 수 있게 해주는 실험적인 라이브러리입니다. 이로써 몇가지 놀라운 작업을 런타임에 할 수 있습니다. 예를 들어, 특정 클래스에 인터페이스를 추가하거나 객체의 타입을 바꾸거나 연산자를 overload 할 수 있습니다.

krakjoe/ilimit

https://github.com/krakjoe/ilimit

이 extension은 어떤 callable이 실행되는 시간이나 소비하는 메모리를 제한하는 메소드를 제공합니다.

Twig 3.0

https://github.com/twigphp/Twig

작은 개선, 더 나은 성능, 더 깨끗한 코드로 업데이트 된 템플릿 엔진입니다.

fzaninotto/Faker 1.9

https://github.com/fzaninotto/Faker/releases/tag/v1.9.0

테스트용 데이터를 생성해주는 Faker가 100개가 넘는 개선을 해냅니다.

cekta/di

https://github.com/cekta/di

A decent PSR-11 implementation.

clue/phar-composer

https://github.com/clue/phar-composer

Composer로 관리되는 모든 PHP 프로젝트에 phar(php archive)를 생성하게 해주는 간단한 라이브러리입니다. 자세한 건 소개글을 읽어보세요.

phplrt/phplrt

https://github.com/phplrt/phplrt

A tool for creating parsers in PHP by specified grammar. For example, json5 parser.

Symfony

Symfony 4.4

https://symfony.com/blog/symfony-4-4-0-released

새로운 기능은 이 블로그전체 목록을 확인하세요.

Symfony 5.0

https://symfony.com/blog/symfony-5-0-0-released

4.4에서 모든 변경점과 symfony/stringsymfony/notifier라는 두 새로운 컴포넌트를 소개합니다. Symfony의 lead 개발자인 Fabien Potencier가 Symfony Notifier를 제공합니다.

A week of Symfony #675 (2 – 8 December 2019)

https://symfony.com/blog/a-week-of-symfony-675-2-8-december-2019

Preloading in PHP 7.4 and Symfony 4.4.

https://symfony.com/blog/new-in-symfony-4-4-preloading-symfony-applications-in-php-7-4

PHP 7.4에서 적용된 Preloading을 소개하고 Symfony에서 설정하는 법을 알려줍니다.

Laravel

Creating a Laravel package

https://johnbraun.blog/posts/creating-a-laravel-package-1

라라벨 패키지를 만드는 tutorial 시리즈입니다.

  1. Package basics: requirements, service providers, testing
  2. Facades, artisan commands, custom configuration
  3. Models, migrations, App\User relations
  4. Routes, controllers, views, assets
  5. Middleware, events & listeners, mail, broadcasting

How to Set Up a Scalable Laravel 6 Application

https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-laravel-6-application-using-managed-databases-and-object-storage

관리형 데이터베이스와 오브젝트 스토리지를 사용한, 확장 가능한 Laravel 6 어플리케이션 만들기.

Laravel Beyond CRUD

https://stitcher.io/blog/laravel-beyond-crud

평균보다 큰 규모의 Laravel 프로젝트에서 일하는 PHP 개발자를 위한 시리즈입니다. 한달 동안 여러 글이 올라왔습니다. Models with the state pattern, Managing Domains, Entering the application layer, View models…

글쓴이 Brent는 트위터로 PHP 소식을 많이 전달하기도 하고, 월간 newsletter도 발행합니다.

On moving the application to Laravel Vapor

https://usefathom.com/news/moved-to-vapor

Heroku에 대한 경험과 왜 Laravel Vapor로 이동하기로 결정했는지를 이야기 합니다. 앞으로 블로그에서 Vapor 관련 팁을 공유 할 예정이라고 합니다.

이 글 끝에는 Laravel Vapor로 운영하는데 도움이 되는 14가지 팁을 제공합니다.

Form Requests – more than validation

https://pociot.dev/22-laravel-form-requests-more-than-validation

Streamlining Laravel

https://jasonmccreary.me/articles/changes-to-streamline-laravel/

향후 라라벨에서 변경됐으면 하는 5가지를 제안합니다.

Astrocasts – Let’s start building a Command Bus with Laravel and Tactician 2.x!

https://www.youtube.com/watch?v=qjhwXKygbjY

Zend/Laminas

Laminas transition update

https://www.zend.com/blog/laminas-transition-update

Zend의 새로운 이름인 Laminas에 몇가지 변경 사항이 있답니다. 2020년 1월에 정식 버전이 릴리스됩니다.

Yii

Yii 2 application optimization

https://2amigos.us/blog/yii2-application-optimization

Yii 2.0.30, extensions, and Yii 3

https://opencollective.com/yiisoft/updates/yii-2-0-30-extensions-and-yii-3

PHP 7.4 will be the minimal required version for Yii 3.

https://forum.yiiframework.com/t/upping-requirements-to-php-7-4/127930

hunwalk/yii2-basic-firestarter

https://github.com/hunwalk/yii2-basic-firestarter

A modified version of the basic template with pre-configured features that can be used to quickly get started on a project.

Async PHP

DriftPHP

ReactPHP와 Symfony 컴포넌트를 기반으로 하는 PHP 프레임웍입니다. - Demo application

clue/reactphp-ami

https://github.com/clue/reactphp-ami
https://clue.engineering/2019/introducing-reactphp-ami

Creating a RESTful API with ReactPHP: Protected Routes

https://www.youtube.com/watch?v=Y0Ve5LMr5hA

기타 읽을 만한 글

How to quickly update PHPUnit from 4 up to PHPUnit 8

https://www.tomasvotruba.cz/blog/2019/11/04/still-on-phpunit-4-come-to-phpunit-8-together-in-a-day/

PHPUnit 버전을 4에서 8까지 올리는 과정을 설명합니다.

  • upgrade PHP 5.3 → 5.6
  • upgrade PHPUnit 4 → 5
  • upgrade PHP 5.6 → 7.0
  • upgrade PHPUnit 5 → 6
  • upgrade PHP 7.0 → 7.1
  • upgrade PHPUnit 6 → 7
  • upgrade PHP 7.1 → 7.2
  • upgrade PHPUnit 7 → 8

Serverless PHP FAQ

https://mnapoli.fr/serverless-php-faq/

Bref로 serverless PHP 어플리케이션을 구성하면서 자주 받는 질문과 답변입니다.

Benchmarks of 4 ways to generate UUID in PHP

https://jolicode.com/blog/uuid-generation-in-php

4가지 방식의 UUID 생성 방식의 성능을 비교합니다.

Videos

Laravel EU 2019

https://www.youtube.com/playlist?list=PLMdXHJK-lGoDhWZ6YJW5B79CDoHWZwDN1

video PHP.Barcelona 2019

https://www.youtube.com/playlist?list=PLrNlZtxTX8XTw7YLlvLAxviKXIFtVFi9I

video Free course on Blackfire.io from SymfonyCasts

https://symfonycasts.com/screencast/blackfire

Podcasts

🔈 Laravel Snippet #18: Clear Writing, Great Quality, Low Pain Tolerance – Another episode in the series on how to make money with open source.

🔈 PHP Internals News podcast #35 – With Scott Arciszewski about recent vulnerability in PHP-FPM, and cryptography in PHP.

🔈 PHP Internals News #37 – PHP 7.4 Celebrations! – Developers talk about their own favorite PHP 7.4 features.

5 Ways to Increase PHP Performance + 🔈 The Undercover ElePHPant #2 with Marco “Ocramius” Pivetta.

PHP의 성능을 높이는 5가지 방법이라는 글에 관한 이야기

4 Considerations When Running PHP Applications On Multiple Servers + 🔈 The Undercover ElePHPant #3 with Larry Garfield and Robert Douglass.

PHP를 여러 서버에서 구동할 때 고려해야할 4가지에 관한 이야기.

One more thing

symfony/thanks로 패키지 개발자들을 지원해주세요.

symfony/thanks 예시

Php_annotated_monthly 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated Monthly 2019년 11월호의 번역본입니다.

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


⚡️ News & Releases

PHP 7.4.0 RC5

PHP 7.4는 11월 말 쯤 하나의 RC 만을 남겨두고 있습니다. What’s new in PHP 7.4를 확인해보세요.

PHP 7.3.11, 7.2.24, 7.1.33

https://www.php.net/ChangeLog-7.php#7.3.11
https://www.php.net/ChangeLog-7.php#7.2.24
https://www.php.net/ChangeLog-7.php#7.1.33

이 업데이트는 심각한 취약성(CVE-2019-11043)을 문제 해결을 포함합니다. 특정 형식으로 request하면 원격 코드 실행이 가능해집니다. PHP-FPM을 사용하고 있다면 당장 업데이트 하세요. 더 자세한 내용을 보고 싶으시면 이 취약성을 분석한 글을 더 읽어보세요.

그나저나 PHP 5.* 버전은 오랫동안 지원되지 않고 있고, 당연히 이 수정사항이 반영되지 않았답니다.

Xdebug 2.8.0

https://xdebug.org/#2019-10-31

PHP 7.4를 완벽히 지원하고 여러 버그 수정과 기능 개선이 있었습니다.

🐘 PHP Internals

[RFC] Union Types 2.0

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

Union Types 2.0 RFC가 거의 만장일치로 진행되고 있다는 소식입니다.

그러나 투표 기간이 2019-10-25 ~ 2019-11-08. 현 시점(11월 9일)에는 Status: Accepted 상태입니다. PHP 8.0에서 만나요.
더 궁금하시다면 Nikita Popov가 이야기하는 팟캐스트(🔈 PHP Internals News #33)에서 들어보세요.

그리고 지난 소식에서 들려드린 것처럼, 토론과 스펙 작업을 GitHub에서 진행했던 것이 전반적으로 성공적이었다고 합니다. 그리고 Nikita는 이런 식의 작업 흐름(GitHub RFC workflow)을 optional/test 모드로 허락할 것을 제안했습니다.

[RFC] Deprecate Backtick Operator (V2)

PHP에서 백틱(backticks, `) 문자를 사용하면 shell_exec()를 실행한 것과 동일한 효과를 볼 수 있습니다. 백틱 안의 문자열을 커맨드로 인식하고 쉘 안에서 실행할 수 있는 것이죠. 이 기능을 deprecate 시키자는 제안이 투표 중에 있습니다(반대가 많네). 이를 제안한 Mark Randall이 참여한 팟캐스트 🔈 PHP Internals News #34에서 더 자세한 이야기를 들어보세요.

[RFC] Implement new DOM Living Standard APIs in ext/dom

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

Benjamin Eberlei는 PHP core extension인 ext/DOM을 DOM Living Standard를 반영하자는 제안을 올렸습니다. 🔈 PHP Internals News #31에서 더 자세한 이야기를 들어보세요.

🛠 Tools

mougrim/php-xdebug-proxy

https://github.com/mougrim/php-xdebug-proxy

여러 유저가 Xdebug를 동시에 사용하기 위해선 Proxy가 필요한데요. 이를 Amp(non-blocking concurrency framework)을 활용해 PHP로 만든 것입니다.

webmozarts/console-parallelization

https://github.com/webmozarts/console-parallelization

symfony/console을 병행으로 실행할 수 있게 해주는 패키지입니다. 이런 식으로…

$ bin/console import:movies --processes 2

php-defer/php-defer

https://github.com/php-defer/php-defer

Go의 defer()의 PHP 버전. 이 함수에 전달된 콜백은 현재 scope을 빠져나올 때 실행됩니다. 내부에는 destructor를 사용했습니다. 사실 새로운 아이디어는 아니고 이미 phplang/scope-exit에서 구현된 바 있습니다.

spatie/phpunit-snapshot-assertions

https://github.com/spatie/phpunit-snapshot-assertions

PHPUnit에서 snapshot-testing을 지원하는 툴입니다. 객체의 상태를 확인해서 이전 테스트와 달라진 것이 있는지 확인합니다.

matteosister/GitElephant

https://github.com/matteosister/gitelephant

Git repository를 php로 다루기 위한 추상 레이어.

danog/MadelineProto

https://github.com/danog/MadelineProto

Telegram의 MTProto protocol을 위한 Async PHP client/server API입니다. Bot API 없이 Telegram과 인터렉션을 할 수 있습니다.

Symfony

Symfony 5: The Fast Track

https://www.kickstarter.com/projects/fabpot/symfony-5-the-fast-track

Fabien Potencier가 새로운 책을 쓰기 위해 crowdfunding을 진행했습니다. Symfony 5 기반의 어플리케이션을 기초부터 프로덕션 레벨까지 만드는 방법을 다룹니다.

You may have memory leaking from PHP 7 and Symfony tests.

https://jolicode.com/blog/you-may-have-memory-leaking-from-php-7-and-symfony-tests

A Week of Symfony #670 (28 October – 3 November 2019)

https://symfony.com/blog/a-week-of-symfony-670-28-october-3-november-2019

Laravel

Laravel beyond CRUD

https://stitcher.io/blog/laravel-beyond-crud

Laravel로 큰 어플리케이션을 어떻게 만들 수 있는가에 대한 책을 위해 정리하는 블로그입니다. 첫 챕터는 Domain-oriented Laravel이고, 그 안에는 PhpStorm에서 코드를 리팩토링하는 방법이 나와있습니다.

Why you should stick to the default Laravel architecture.

https://schlein.net/blog/stick-to-the-default

Crafting maintainable Laravel applications

https://jasonmccreary.me/articles/crafting-maintainable-laravel-applications/

유지보수를 지속할 수 있는 Laravel 어플리케이션 만들기

  • Stay Current
  • Adopt the standards
  • Vanity namespaces
  • Default the structure
  • Where things go
  • Managing packages
  • Smooth bindings
  • Configuring Configs
  • Avoid overwriting
  • Grok the framework
  • Honor the MVC architecture
  • Write tests

Deploying Laravel Projects to Kubernetes.

https://medium.com/swlh/deploying-laravel-projects-to-kubernetes-a29edc0b588e

🔈 ‎Laravel Lunch Break

https://www.laravellunchbreak.com/1

Marcel Pociot와 Dries Vints의 새로운 팟캐스트 등장.

🎥 Astrocasts: Event Sourcing with Laravel and EventSauce.

https://astrocasts.com/live-sessions/projects/event-sourcing-with-laravel-and-eventsauce/session-3

🎥 A series of videos on How to use TDD to build a REST API in Laravel

https://www.youtube.com/playlist?list=PLrIm-p2rpV0F-rl4NPjNslEmW-D83AHOr

🎥 Screencasts on creating laravel-shift/blueprint.

https://www.youtube.com/watch?v=2sPfQIC7cqk

Zend/Laminas

올 해 초, Zend Framework이 Laminas로 이름을 바꾼다는 소식이 있었습니다. 프로젝트 저장소에는 Laminas로 마이그레이션 할 수 있는 laminas/laminas-migration(현재까지는 테스트 목적으로만 가능)와 guide on how to test migration문서가 존재합니다.

🌀 Async PHP

seregazhuk/php-watcher

https://github.com/seregazhuk/php-watcher

특정 디렉토리에 파일이 변경되는 것을 보면서 오랫동안 실행되는 PHP 어플리케이션을 재시작 해줍니다.

Building RESTful API With ReactPHP

https://leanpub.com/building-restful-api-with-reactphp

video tutorial 시리즈에 기반한 새로운 책.

apisearch-io/symfony-react-server

https://github.com/apisearch-io/symfony-react-server

Symfony Async Server built on top of ReactPHP.

기타 읽을 만한 글

What is garbage collection in PHP

https://tideways.com/profiler/blog/what-is-garbage-collection-in-php-and-how-do-you-make-the-most-of-it

PHP에서의 garbage collection을 다룬 글입니다.

Derick Rethans와 함께 토론한 팟캐스트도 확인해보세요.

An example of creating a custom inspection in PhpStorm

https://medium.com/@claudsonm/mysql-reserved-words-checker-for-laravel-migrations-on-phpstorm-2d34b5fcde75

PhpStorm에서 custom inspection을 만드는 방법을 소개합니다. MySQL 예약어 검사기를 예로 들고 있습니다.

On using the @mixin tag in DоcBlock

https://freek.dev/1482-the-mixin-php-docblock

@mixin DocBlock으로 IDE에서 자동 완성을 지원하는 방법을 소개합니다. De facto 표준처럼 자리잡은 phpDocumentor에는 mixin tag를 지원하지 않으므로 IDE별로 다를 순 있지만 PhpStorm에선 완벽히 지원한다고 합니다.

The value of the void typehint in PHP

https://freek.dev/1481-the-value-of-the-void-typehint-in-php

void typehint의 가치. return type에 void를 명시적으로 지정하면서 의도를 명확히 하는 것을 좋아하는 것 같습니다.

Embracing simplicity in your code

https://pociot.dev/21-embracing-simplicity-in-your-code

코드에서 간결함을 유지하는 방법을 설명하고 있습니다. 이런 예제를 모아 video course를 준비하려고 한다는 군요.

어쩐지 Laracon에서 Colin DeCarlo가 발표한 동영상에서의 관점과 비슷하다는 느낌이 들었습니다.

Solving the N+1 problem in ORMs.

https://thecodingmachine.io/solving-n-plus-1-problem-in-orms

ORM에서 N+1 문제를 해결하는 방법입니다. 이 글로 여러 피드백을 받은 것 같고, 이 아이디어는 이미 많은 ORM 도구에서 도입하고 있었다고 update를 추가했네요.

PHP: Past and Future

https://blog.krakjoe.ninja/2019/10/php-past-and-future.html

PHP가 2008년 이후로 어떻게 변화했고, PHP 4와 PHP 8의 성능도 비교해줍니다.

Examples of using FFI from PHP 7.4

🎥 Videos

PHP Yorkshire 2019 videos

https://www.youtube.com/playlist?list=PLizA60F3A-6xi1CEmSMrR_d2vTZ4UspiO

재생 목록은 아래와 같습니다.

  • Asmir Mustafic - Building Modular Architectures
  • Clinton Ingrams - SOCcing: Responding to a Cyber Incident
  • Damien Seguy - Top 10 PHP Classic Traps
  • Daniel Shaw - Thinker, Tester, Lawyer, Spy
  • Katy Ereira - Testing Legacy Code & Safe Refactoring
  • Larry Garfield - Free Software: It’s not about the license
  • Lorna Mitchell - A Meritocracy of Pull Requests
  • Michael Heap - API Standards 2.0
  • Larry Garfield - Building a cloud-friendly application
  • Michelle Sanver - An introduction to Graph Databases in PHP, using Neo4j
  • Vitor Brandao - Build your own Neural Network, with PHP!

PHP Serbia 2019 videos

https://www.youtube.com/playlist?list=PLizA60F3A-6xi1CEmSMrR_d2vTZ4UspiO

재생 목록은 아래와 같습니다.

  • The Opening Ceremony PHP Serbia Conference 2019 | #phpsrb
  • PHP Serbia Conference 2019 | Official After-movie | #phpsrb
  • PHP Serbia Conference 2019 - Day 1 | #phpsrb
  • PHP Serbia 2019: Zeev Suraski - Keynote Talk | #phpsrb
  • Srdjan Vranac - Be nice, help the person who hacks your servers to get your data | #phpsrb
  • Herberto Graca - Making architecture explicit | #phpsrb
  • Rafael Dohms - Application Metrics (with Prometheus examples) | #phpsrb
  • Ondřej Mirtes - Testing Strategy with the Help of a Static Analyzer | #phpsrb
  • Ian Littman - Load Testing Your App | #phpsrb
  • Nuno Maduro - Writing Effective PHP | #phpsrb
  • Panel Discussion: Road to seniority | #phpsrb
  • Marcel Pociot - Getting started with WebSockets | #phpsrb
  • Ivan Jovanovic - Micro Frontends - A microservice approach to the modern web | #phpsrb
  • Pauline Vos - Git Legit | #phpsrb
  • Matt Brunt - Content Security Policies: Let’s Break Stuff | #phpsrb
  • Sebastian Feldmann - Hello my name is “if” | #phpsrb
  • Matthieu Napoli - Serverless PHP applications with Bref | #phpsrb
  • Juliette Reinders Folmer - The Big “Why equal doesn’t equal” Quiz | #phpsrb
  • Alexander Makarov - Yii, PHP and frameworks | #phpsrb
  • Sebastian Thoss - SmokeTests - The what, why and how | #phpsrb
  • Andreas Heigl - The First Contact | #phpsrb
  • Damien Seguy - Top 10 PHP coding traps | #phpsrb
  • Bastian Hofmann - Getting started with Kubernetes | #phpsrb
  • Rowdy Rabouw - Browser APIs: the unknown Super Heroes | #phpsrb
  • Gabor Nadai - 6 Things I Learned as a Lead Developer | #phpsrb
  • Antonio Peric Mazar - Symfony 4: A new way to develop applications | #phpsrb
  • PHP Serbia Conference 2019 Grand Opening Ceremony | #phpsrb
  • Dušan Dželebdžić – interview about PHP Serbia 2019 | #phpsrb
  • Andreas Heigl, software developer and speaker at PHP Serbia 2019 – interview | #phpsrb
  • Alexander Makarov about PHP Serbia 2019 - interview | #phpsrb
  • Marcel Pociot about PHP Serbia conferences – interview | #phpsrb
  • Zeev Suraski, co-architect of PHP and co-founder of Zend about PHP Serbia 2019 Conference | #phpsrb
  • Robert Bašić – interview about PHP Serbia 2019 | #phpsrb
  • Thomas Dutrion - You’re not a {framework} developer! | #phpsrb
  • [WORKSHOP] Marko Mitranic: Boosting your performance with Blackfire #phpsrb
  • [WORKSHOP] Bastian Hofmann: Deploying your first Micro-Service application to Kubernetes #phpsrb
  • [WORKSHOP] Thomas Dutrion: Symfony as a software engineer #phpsrb 2019

Beachcasts: Store sensitive data in environment variables using phpdotenv

https://www.youtube.com/watch?v=oTrJfgUF1SI

🔈 Podcasts

Taylor said

Taylor Otwell이 그의 트위터에서 지난 5 년 동안 아칸소의 작은 도시에 있는 동안 $ 10,000,000 상당의 소프트웨어를 판매했다고 합니다. 아래 링크의 Laravel Snippet 팟캐스트에서 어떻게 성공적인 제품을 만들 수 있는지 이야기 한다고 합니다.

The Undercover ElePHPant

https://undercover-elephpant.com/episodes/introducing-the-undercover-elephpant

Matthew SetterBenjamin Eberlei이 호스트로 있는, PHP 응용 프로그램의 확장 및 최적화에 관한 팟캐스트.

PHP Internals News #32

https://phpinternals.news/32

James Titcumb에게 듣는, 상업용 PHP extension 개발.

Interviews from php[world]: Cal Evans, Taylor Otwell, Samantha Quiñones, and Gary Hockin.

https://www.phparch.com/podcast/25-interviews-from-phpworld/

Voices of the ElePHPant

Laravel Vapor가 유명세를 떨치고 있는 와중에, 국내에서는 상대적으로 덜 주목받는 프로젝트를 소개합니다.

AWS

작년 12월 php-annotated-monthly에 Lambda Layers를 소개드린 적이 있습니다.

AWS re:Invent 2018 conference에서 발표된 내용에 따르면 AWS Lambda에서도 PHP를 쓰기 위해 우회하지 않아도 정식으로 쓸 수 있게 됐습니다.

Lambda Runtime API를 사용하면 되는데, stackery/php-lambda-layer(AWS SAM 기반. 현재는 활발히 운영되는 저장소가 아닙니다)를 통해 만들거나 직접 만들 수도 있다고 소개 드렸습니다.

이후 AWS 서버리스 환경에서 PHP를 실행하기 위한 많은 툴이 등장했고, Google App Engine에는 PHP 7이 표준 환경으로 포함되어 있습니다. 이들 환경에서 Hello World PHP 코드 하나 실행하는 것은 큰 어려움이 없으므로 각 환경에서 Laravel Framework으로 실행하는 방법이나 정리해보고자 글을 시작했습니다. (그것 또한 너무 간단합니다만..)

AWS Lambda에는 PHP built-in support가 없으므로 Lambda layers를 통해 3rd-party runtime을 필요로 합니다. 앞으로 소개할 Serverless PHP에 도움이 되는 프로젝트는 Layers라고 불리는 PHP용 runtime을 제공합니다.

Bref

https://bref.sh/docs/

Serverless(“The complete solution for building & operating serverless applications”)라는 프레임웍을 활용해 PHP 응용 프로그램을 간단하게 실행하는 것을 목표로 합니다.

그렇다면 이미 Serverless 만으로도 PHP 어플리케이션을 띄우는 것이 가능하다는 사실.

https://serverless.com/examples/

여기서 PHP나 Java로 검색하면 결과가 하나씩 나옵니다. 상대적으로 관심이 덜한 언어라고 해야할까요?

어쨌든 간단한 PHP 예제인 serverless/examples 페이지로 들어가 봅시다. serverless.yml을 열어보면 Apache OpenWhisk가 제공하는 PHP runtime을 활용하는 것을 볼 수 있습니다.

AWS Lambda에 쉽게 올리는 PHP 코드와 같은 식의 글은 대부분 이런 식입니다. 결국 AWS에서는 누군가가 만들어 놓은 runtime이 필요하구나…생각하시면 되겠습니다. 물론 직접 만들 수도 있습니다.

AWS의 블로그에 PHP runtime을 만드는 좋은 글이 있긴 하지만, PHP 7.3 기반의 runtime을 만들 수 있는 방법을 소개하는 글도 있습니다.

  • Lambda Execution Environment의 기초가 되는 AMI를 여기서 찾아 인스턴스를 띄우고, Lambda function을 관리할 수 있는 IAM Role을 부여한 후, ssh로 접근해서 PHP를 컴파일 합니다. 그리고 나서 이리저리 요래오래 막 하면 됩니다…

위에서 언급한 Apache OpenWhisk는 PHP를 정식으로 지원하는데요. 더 확인하고 싶으시면 아래를 참고하시고요.

다시 Bref

다시 Bref 이야기를 해보죠. 갑자기 기분이 이상해서 제가 5월에 공유한 php-annotated-monthly을 뒤져봤습니다. Bref는 분명 AWS SAM을 기반으로 했다고 써있는 겁니다.

사실 그동안 Serverless로 가느냐 SAM으로 가느냐 여러 논의가 있었더랬습니다. Serverless는 AWS에 종속되지 않으므로 확장성 면에서 더 유리하기 때문이가 싶었지만, Bref는 어차피 AWS만 지원하는데…

이슈를 좀 뒤져보면 커뮤니티 내부에서도 좀 혼란스러웠던 것 같습니다.

https://github.com/brefphp/bref/issues/99

  • Serverless와 SAM 비교 (뭐 하나가 특별히 우월하진 않은 모양입니다)

https://github.com/brefphp/bref/issues/320

  • “Mainly: it supports layers and it can run things locally with Docker”라고 이유를 밝혔습니다.

Bref를 활용한 또 다른 사례 연구들을 찾아봐도 혼란스럽습니다.

https://blog.deleu.dev/deploying-laravel-artisan-on-aws-lambda/

  • SAM 활용

https://blog.servmask.com/serverless-for-php-developers/

  • Serverless 활용

어쨌든 아직까지는 공식적으로 Serverless를 사용합니다.

참고로 Taylor Otwell이 Vapor를 발표할 때, Bref와의 차이가 뭐냐는 질문에 아래와 같이 답변했었습니다.

Yes a bit different… the whole setup is custom and not based on SAM or Serverless Framework… queue and web are separate lambdas… we have a few PHP extensions that are not on Bref runtime such as GD

진짜 Bref 이야기

공식 문서에 소개된 글을 읽어보죠.

Bref(Brief를 프랑스어로 한 것)는 Composer 패키지로 제공되며 PHP 애플리케이션을 AWS에 배포 하고 AWS Lambda 에서 실행할 수 있도록 도와줍니다

Why Bref?
* Bref는 PHP 응용 프로그램을 간단하게 실행하는 것을 목표로합니다
* (모든 요구 사항을 해결하는 대신) 선택을 줄여 문제를 단순화
* (강력한 맞춤형 솔루션을 목표로하는 대신) 간단하고 친숙한 솔루션 제공
* (불완전한 추상화 뒤로 너무 많은 것을 숨기는 대신) 지식을 공유하여 힘을 실어 준다

대충 뭔가 쉽다는 이야기입니다. (잘 하려면 어렵다는 이야기이기도…)

Bref는 다음을 제공합니다.
* 문서
* AWS Lambda 용 PHP 런타임
* 배포 툴링
* PHP 프레임 워크 통합

이 정도는 뭐 당연히 제공해야할 것으로 보이긴 합니다.

Bref를 통해 구현할 수 있는 것은

Use cases
* APIs
* workers
* batch processes/scripts
* websites

이런 다양한 용도로 사용할 수 있다고 하고요. 구현 사례에 가보시면 더 많은 예제를 보실 수 있습니다.

최근에는 externals.io(PHP internals 소식을 외부로 가져오는 서비스)가 Bref로 LAMP에서 Serverless로 성공적으로 옮겨왔다는 소식을 전해드리기도 했었죠. 꽤 유익한 글입니다.

From LAMP to serverless: case study of externals.io

여기에는 Serverless로 올렸을 때의 비용을 계산해주는 기능도 소개해줍니다.

(사실 external.io는 Bref를 운영하는 null이란 회사에서 운영 비용을 지원해주고 있습니다. )

계속 공식 문서를 보자면,

maturity-matrix에 언급하기로 Legacy application이나 Jobs/Cron의 난이도(문서나 가격면에서)를 제외하면 꽤 자신있는 모습입니다.

Bref로 Lambda 실행하기

우선 공식 문서의 GETTING STARTED 중 InstallationFirst steps 그리고 Deployment guide를 따라하면 Lambda에서 실행할 준비가 됩니다.

이런 식입니다. 프로젝트를 만들고,

composer require bref/bref
vendor/bin/bref init

여기서 주의깊게 봐야할 것이 serverless.yml 파일입니다. Serverless framework에서 제공하는 간단한 설정 파일인데, tutorial을 따라하시게 되면 아마 region 정도 바꿔주시면 될 겁니다.

composer install --optimize-autoloader --no-dev
serverless deploy

이 단계에서 CloudFormation stack으로 배포되는데, 아래와 같은 서비스들을 묶어주는 것 뿐입니다.

  • lambda functions
  • S3 buckets
  • databases

이런 전체 스택이 한번에 뜨고, 지울 땐 같이 지워집니다.

몇 분 후 배포가 되면

❯ serverless deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service app.zip file to S3 (3.4 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.................................
Serverless: Stack update finished...
Service Information
service: app
stage: dev
region: us-east-1
stack: app-dev
resources: 11
api keys:
None
endpoints:
ANY - https://**********.execute-api.us-east-1.amazonaws.com/dev
ANY - https://**********.execute-api.us-east-1.amazonaws.com/dev/{proxy+}
functions:
api: app-dev-api
layers:
None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.

위에 노출된 endpoint로 실행 결과를 확인하실 수 있습니다.

모니터링도 해볼까요?

vendor/bin/bref dashboard

Bref로 Laravel 띄우기

공식 문서에선 Laravel이나 Symphony 프로젝트를 띄울 수 있는 방법을 안내해줍니다.

https://bref.sh/docs/frameworks/laravel.html

우선 Laravel 프로젝트를 만들어 보고요.

composer create-project --prefer-dist laravel/laravel breftest

serverless.yml을 생성합니다.

service: bref-demo-laravel

provider:
name: aws
region: us-east-1
runtime: provided
environment:
# Laravel environment variables
APP_STORAGE: '/tmp'

plugins:
- ./vendor/bref/bref

functions:
website:
handler: public/index.php
timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
layers:
- ${bref:layer.php-73-fpm}
events:
- http: 'ANY /'
- http: 'ANY /{proxy+}'
artisan:
handler: artisan
timeout: 120 # in seconds
layers:
- ${bref:layer.php-73} # PHP
- ${bref:layer.console} # The "console" layer

데모 프로제트 저장소의 serverless.yml를 살펴보아도 좋습니다.

Laravel과 같은 프레임워크를 띄우기 위해선 몇가지 소스 수정이 되어야 합니다(이 역시 공식 문서에 잘 설명되어 있습니다).

Lambda는 /tmp를 제외하고는 read-only이므로 compile된 view 파일을 담기 위해 path 설정을 해줘야 합니다.

bootstrap/app.php 파일에서 $app = new Illuminate\Foundation\Application 다음에 아래와 같이 수정해줍니다.

$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
/*
* Allow overriding the storage path in production using an environment variable.
*/
$app->useStoragePath($_ENV['APP_STORAGE'] ?? $app->storagePath());

.env에는 아래 설정이 필요합니다.

VIEW_COMPILED_PATH=/tmp/storage/framework/views 

# We cannot store sessions to disk: if you don't need sessions (e.g. API) # then use `array`, else store sessions in database or cookies
SESSION_DRIVER=array

# Logging to stderr allows the logs to end up in Cloudwatch
LOG_CHANNEL=stderr

마지막으로 app/Providers/AppServiceProvider.php에서 view 파일용 디렉토리를 생성해줍니다.

public function boot()
{
// Make sure the directory for compiled views exist
if (! is_dir(config('view.compiled'))) {
mkdir(config('view.compiled'), 0755, true);
}
}

배포하기 전 config cache 파일은 지워줍니다. path가 달라져서 문제가 생길 수 있어요.

php artisan config:clear

Google App Engine

Google App Engine에는 PHP 7이 표준 환경으로 포함되어 있습니다.

Google App Engine > 공식 문서

공식 문서에 Laravel을 올리는 tutorial도 있습니다.

크게 어렵지 않은데요.

app.yaml을 생성합니다.

runtime: php72

env_variables:
## Put production environment variables here.
APP_KEY: YOUR_APP_KEY
APP_STORAGE: /tmp
VIEW_COMPILED_PATH: /tmp
SESSION_DRIVER: cookie

YOUR_APP_KEY 부분에는 application key를 생성해 넣어야죠.

php artisan key:generate --show

GAE에서도 /tmp만 쓸 수 있는 것은 동일해서 해야할 것은 크게 다르지 않습니다.

# [START] Add the following block to `bootstrap/app.php`
/*
|--------------------------------------------------------------------------
| Set Storage Path
|--------------------------------------------------------------------------
|
| This script allows you to override the default storage location used by
| the application. You may set the APP_STORAGE environment variable
| in your .env file, if not set the default location will be used
|
*/
$app->useStoragePath(env('APP_STORAGE', base_path() . '/storage'));
# [END]

캐싱 문제를 해결하기 위해 composer dependency를 제거합니다.

composer remove --dev beyondcode/laravel-dump-server

배포하면,

gcloud app deploy

짠!

Firevel

독특한 프레임웍을 하나 더 소개해드립니다.

역시 이전에 php-annotated-monthly에서 소개됐던 글입니다.

Serverless PHP on App Engine + Cloud Firestore and Firevel.

Google App Engine에서 잘 실행될 수 있게, Laravel을 수정해 Firevel이라는 프레임웍을 만들었다고 합니다. Firestore를 DB와 캐시로 사용합니다. Eloquent가 NoSQL을 고려하지 않았기 때문에 이에 대응하는 Firequent라는 패키지도 개발했다고 합니다.

README에 나온 간단한 Installation 정도면 쉽게 서비스를 띄울 수 있습니다. 저는 로컬 환경에서 생소한 gRPC extension 같은 걸 설치하면서 삽질을 좀 했는데, 환경만 준비되면 서버 띄우는 건 쉽습니다.

그러나 이미 Laravel에 익숙하신 분들에겐 Firequent 등 너무 많은 신지식을 필요로 하기 때문에, ‘굳이 저런 걸…’이라는 생각이 들 수 밖에 없지만 흥미롭긴 합니다. (흥미롭고 안 써야지)

정리

고작 Laravel 기본 페이지를 띄워 본 정도라서 얼마나 Laravel의 경험을 그대로 이어갈 수 있을지는 모르겠습니다. Production 레벨로 올리기에는 아마도 삽질을 많이 해야겠지만, 잘 쓰면 편하고 저렴한 비용으로 서비스를 할 수도 있겠습니다.

잠깐. 저렴하다고요?

Serverless: slower and more expensive | Hacker News

Serverless: 15% slower and 8x more expensive - Einar Egilsson

The cost of serverless - Faun - Medium

The hidden costs of serverless - Amiram Shachar - Medium

가벼운 페이지에 사람 손을 덜 타는 페이지라면 도전해볼만 하지 않겠습니까?

0%