php-annotated-monthly-september-2019

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP 7.4.0 RC1

https://www.php.net/index.php#id2019-09-05-1

7.4 버전의 release-candidates cycle이 시작되었습니다. GA(General Availability) release까지 최소 6번의 RC가 진행될 예정입니다.

PHP 7.1.32, PHP 7.2.22, PHP 7.3.9

https://www.php.net/archive/2019.php#2019-08-30-1
https://www.php.net/archive/2019.php#2019-08-29-2
https://www.php.net/archive/2019.php#2019-08-29-1

임의의 코드를 실행할 수 있는 심각한 취약점이 몇가지 수정되었습니다. 이 취약점이 악용되었다는 보고는 아직 없는 것 같습니다. 내용은 각 change log에서 확인하실 수 있습니다.

Monolog 2.0.0

https://github.com/Seldaek/monolog/releases/tag/2.0.0

처음 언급된 이후 4년이 지나 2.0이 발표되었습니다.

PHP 7.2부터 지원하고, 가능하다면 type hint를 제공하고, strict_type mode를 지원하며, 새로운 핸들러(SqsHandler, TelegramBotHandler 등)를 추가했습니다. Deprecated 됐던 일부 핸들러(RavenHandler, SlackbotHandler 등)는 제거됐는데 README 페이지에서 대체품을 확인할 수 있습니다.

Monolog 1.x도 계속 지원한다고 합니다.

🐘 PHP Internals

Straw poll for P++ feasibility

https://wiki.php.net/rfc/p-plus-plus

지난 달 소식에서 소개된 P++의 타당성에 관한 설문 조사가 있었고, 이 아이디어는 완전히 불가능한 것으로, PHP 커뮤니티에서 만장일치로 거부되었습니다.

[PoC] throw_legacy_failure declare statement

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

흥미로운 PoC(proof of concept)이 있었다는 군요.

기존 오래된 PHP function들이 동작을 계속할 수 없을 때 null이나 false를 return하던 것을 Exception을 throw하는 것으로 대체하고 있습니다. 물론 모든 null/false return을 throw로 대체한다는 것은 아닙니다. strpos에서 needle을 찾을 수 없을 때 false를 리턴하는 것은 정상 동작으로 고려합니다.

적용 방식은, 파일 단위로 strict_types를 선언하고 이어서 declare(throw_legacy_failure=1)처럼 추가 선언하는 식으로 구현되었습니다.

[RFC] Reclassifying engine warnings

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

Nikita Popov는 이 제안에서 PHP 엔진에 존재하는 warning과 notice를 살펴보고 그들의 분류가 여전히 적절한지 재평가 할 것을 제안합니다. “Undefined variable” 같은 건 최소한 Warning은 되어야 한다는 식이죠.

[RFC] Union Types v2

https://github.com/nikic/php-rfcs/blob/union-types/rfcs/0000-union-types-v2.md

2015년의 Bob & Levi의 제안을 이어받아 PHP 8에 Union Type을 추가할 것을 제안합니다.

어디서든 타입을 선언할 때 여러 타입을 명시할 수 있습니다.

class Number {
private int|float $number;

public function setNumber(int|float $number): void {
$this->number = $number;
}

public function getNumber(): int|float {
return $this->number;
}
}

특히 이번 RFC가 흥미로운 것은 GitHub 기반의 RFC workflow를 실험해보고 있다는 사실입니다. Nikita가 php-rfcs라는 저장소를 만들어서 올린 것입니다. 아무나 토론에 참여할 수 있었고, 이모지로 표현하기도 했습니다. RFC 토론에서는 거의 볼 수없는 기술적 세부 사항에 대한 많은 토론이있었다고 합니다.

이에 대한 Nikita의 감상은 여기서 확인하실 수 있습니다.

In PHP 8 error_reporting will be E_ALL by default

https://github.com/php/php-src/pull/4659/files

PHP 8에서는 현재의 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 대신 E_ALL로 변경됩니다.

🛠 Tools

RubixML/RubixML

https://github.com/RubixML/RubixML

PHP에서 machine learning을 사용하며 활발히 개발되는 패키지입니다. 여러가지 좋은 예제가 많습니다.

휴대폰 센서 데이터를 활용해 앉기, 일어나기, 눞기 등의 인간 행동을 분류하는 classifying human activities, 이미지로부터 사물을 인식하는recognition of objects on images, 주택 가격을 예상하는 predicting house prices.

Nyholm/psr7

https://github.com/Nyholm/psr7

A lightweight and strict PSR-7 implementation.

ivopetkov/html5-dom-document-php

https://github.com/ivopetkov/html5-dom-document-php

기존의 DOMDocument를 확장하고 수정한 HTML5 파서입니다.

quasilyte/phpgrep

https://github.com/quasilyte/phpgrep

PHP 코드를 찾기 위한 검색 툴입니다. Grep과 비슷한데, PHP 문법을 이해하는 점이 다릅니다. Go에서 구현되었고, mvdan/gogrep에서 영향을 받았습니다. PhpStorm의 Structural Search and Replace (SSR)와도 비슷합니다.

더 자세한 건 이 발표자료를 통해 확인하실 수 있습니다.

voku/portable-utf8

https://github.com/voku/portable-utf8

Unicode 문자열을 처리하는 UTF-8 library입니다. “mbstring”이나 “iconv” 혹은 다른 PHP extension을 쓰지 않고도 사용할 수 있습니다. Github README에서 많은 예제를 확인하실 수 있습니다.

PHPCompatibility/PHPCompatibility 9.3.0

https://github.com/PHPCompatibility/PHPCompatibility/releases/tag/9.3.0

다양한 PHP 버전과의 호환성을 검사하는 PHP_CodeSniffer를 위한 문법 세트입니다. PHP 7.4가 추가됐군요.

nunomaduro/yorn

https://github.com/nunomaduro/yorn

JavaScript 스타일의 ‘import’ / ‘export’ 문법을 쓸 수 있게 해주는 PoC 코드입니다.

import, export 예제

이전에도 비슷한 시도는 있었다고 하는군요.

Symfony

Sylius 1.6

https://sylius.com/blog/sylius-1-6-with-refreshed-admin-and-headless-ecommerce/

Symfony 기반의 인기있는 e-commerce platform이 버전업 했다는 소식.

Abstracting API calls with Symfony serializer.

https://tech.yappa.be/abstracting-api-calls-with-symfony-serializer

Symfony serializer로 API 요청을 3 단계로 추상화하는 방식을 소개합니다.

  • The API endpoints (clients)
  • Request data models
  • Response handlers

Creating a dockerised Symfony application and a Makefile based build script.

http://www.inanzzz.com/index.php/post/fr4t/creating-a-dockerised-symfony-application-and-a-makefile-based-build-script

Validate an object based on its previous version.

https://medium.com/@ger86/symfony-validate-an-object-based-on-its-previous-version-4b6ca7a85dc6

Object의 기존 상태를 기준으로 validation을 처리하는 방법을 소개합니다.

Validator component에 Doctrine의 UnitOfWork 컨셉을 적용합니다.

Laravel

Laravel 6

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

Laracon EU conference에서 가 언급되었습니다(이 글을 읽는 시점에 이미 발표가 됐죠). LTS release에 3년 간 security updates를 받을 수 있습니다. Semver를 따르기로 했고, 첫번째 버전 숫자가 좀 더 빠르게 증가한다는 의미입니다. 7버전은 이번 겨울에 발표될 예정입니다. Laracasts에서 Laravel 6에 대해 더 알아보세요.

facade/ignition

https://github.com/facade/ignition

Laravel 6는 완전 새로운 error page를 선보였습니다. Whoops에 기초하고 있으나 더 많은 정보를 보여주고 여러분이 브라우저를 떠나지 않고도 문제를 수정할 수도 있습니다.

Videos from Laracon US 2019

https://www.youtube.com/playlist?list=PL-yJve--iT5qZzp0VzYaPA7ZohLl6tSdp

PHP Townhall #68: Behind the Facade

https://phptownhall.com/episode-68-behind-the-facade-2019/

Matt Trask와 Ben Edmunds가 Taylor Otwell의 초대로 Laravel의 새로운 점과 비즈니스적인 면, 그리고 거대한 컨퍼런스를 조직하는 일 등을 이야기 합니다.

🌀 Async PHP

Creating a RESTful API with ReactPHP

ReactPHP에 관한 두개의 동영상을 소개합니다.

Improving HTTP responses
Managing Orders

apisearch-io/symfony-async-kernel

Symfony 기반의 Async kernel입니다. Demo 어플리케이션도 확인해보세요 : apisearch-io/symfony-react-demo

clue/reactphp-stdio

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

ReactPHP로 interactive한 CLI-tool을 만들 수 있는 툴입니다.

사용자 키 이벤트가 발생하자마자 응답 할 수 있는 방법을 여기서 더 확인해보세요.

💡 기타 읽을 만한 글

How to use data providers in PHPUnit

https://blog.martinhujer.cz/how-to-use-data-providers-in-phpunit/

PHPUnit에서 Data Providers를 활용하는 방법입니다. 여러분이 잘 몰랐던 부분도 있을 겁니다.

  • Tip #1: Always name the data providers
    • 이름을 꼭 넣어서 테스트 결과의 가독성을 높여주기
  • Tip #2: You can run single data set from data provider
    • filter를 통해 특정 data set만 사용
  • Tip #3: Add type definitions
    • 가능하면 data provider나 test 함수 인자에 타입을 정의할 것
  • Tip #4: Data providers are supported well in PhpStorm
  • Tip #5: More complex data providers
    • 동적으로 데이터를 생성할 수도 있음
  • Tip #6: You can use Closures in Data providers to delay evaluation
    • 클로저 활용
  • Tip #7: Use yield to simplify large nested arrays
    • 배열이 너무 중첩되었다면 yield를 사용해서 가독성을 높일 수는 있으나 모든 yield는 테스트 시작 시점에 evaluated 됨
  • Tip #8: Don’t use @testWith annotation
    • 주석은 당신의 코드를 넣기에 적당한 곳은 아니다
    • syntax highlighting does not work there
    • IDE code validation does not work there
    • automatic code formatting does not work there
    • it cannot be analysed statically by PHPStan

From LAMP to serverless

https://mnapoli.fr/serverless-case-study-externals/

AWS Lambda에 Bref를 통해 serverless PHP 어플리케이션을 올리는 예제입니다.

PHP internals의 내용을 외부에 공개하는 Readonly 웹사이트인 externals.io를 LAMP에서 Serverless로 마이그레이션 했던 과정과 결과를 분석합니다.

이외에 더 많은 case study는 여기서 확인하실 수 있습니다.

A first look at Slim 4

https://akrabat.com/a-first-look-at-slim-4/

Analysis of SQLi and PHP Object Injection vulnerabilities in SuiteCRM

https://blog.ripstech.com/2019/breaking-into-your-internal-network/

SuiteCRM을 사용하시는 분들은 최대한 빨리 최신 버전으로 업그레이드 하시랍니다.

Being explicit about entity managers

https://blog.kennard.dev/2019-08-28-being-explicit-about-entity-managers/

Videos from the Blackfire meetup at Datadog NYC HQ

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

Blackfire meetup에서의 발표 동영상 셋입니다.

  1. Profiling PHP apps with Blackfire
  2. Tracing: Flame graphs of your production PHP
  3. Developing cacheable backend applications

특히 3번 동영상은 PHP backend 어플리케이션에서의 다양한 캐싱 방법을 소개합니다.

🔈 Podcasts

PHP Internals News #24, PHP Internals News #25

  • With Stanislav Malyshev on security related aspects of PHP development and using a fuzzer to test the input safety of data coming into PHP.

PHP Internals News #26

  • With Nicolas Grekas about how the Symfony project approaches the task of making it ready for PHP 7.4.

php[architect] – Symfony 4, legacy code, the future of PHP, and Karl Hughes.

No Plans to Merge – @DCoulbourne and @calebporzio talk about Laravel 6 and other things.

💬 Community

Matthew Weier O’Phinney is looking for new adventure

https://mwop.net/blog/2019-09-03-looking-for-a-new-adventure.html

Zend Framework(Laminas)의 Lead이자 PHP-FIG의 창립 멤버인 Matthew Weier가 무려 14년이나 일했던 Zend를 나왔다는 이야기입니다.

리모트로만 일한다고 하니 요즘 사람 구하기 어려우신 분들은 연락 한번…

Brent Roose and Joe Watkins exchanged opinions on where the PHP team is right now, and what can be done to make it better

Brent Roose가 PHP team에 공개 메일을 보냈습니다. - A letter to the PHP team

  • 최근에 한번 프로세스가 변경이 되긴 했지만(더 긴 투표 시간과 2/3 이상의 찬성), 현재의 RFC 방식은 너무 폐쇄적이며, 반복적으로 RFC가 올라오고 토론하고 싸우고 논란이 됩니다(최근의 예로는 short tag에 관한 토론). 타 언어의 예로 들어 좀 더 개방적으로 토론할 것을 제안합니다. ECMAScript 진영에서는 Dr. Axel Rauschmayer의 훌륭한 포스트에서 보는 것처럼 TC39 process가 동작하는 방식을 알 수 있고, Rust의 공개 포럼의 예도 있습니다. TC39는 언어가 어떻게 진화 할 수 있는지에 대한 명확한 틀을 제공하며, PHP 의 현재 RFC 프로세스 보다 우수하고 혼동되지 않는 시스템입니다.

여기에 Joe Watkins가 응답합니다. - Bearings

  • PHP 내부에는 사실 파벌이란 것이 존재하지 않고, short tags 논란에서는 RFC의 기고자의 잘못이 있긴 해도 프로세스 상의 실패이기도 하므로 공식적인 deprecation 정책을 생각해볼 때가 된 것 같습니다. 그러나 최근 몇 개의 토론 만으로 PHP 프로세스에 대해 결론을 내리고, 그 결론에 대한 해법을 내는 것은 의미가 없습니다.
  • 프로세스를 변경하는 시간과 노력은 상당하며, 프로세스가 실패했거나 실패할 가능성이 있을 때만 우선 순위에 둡니다. 세부적으로는 다르지만, 다른 오픈 소스 프로젝트도 동일한 프로세스로 작동합니다. 규칙을 정하고, 사람들이 따르도록 노력하며, 중단되면 수정합니다.
  • 메일 링리스트가 의사 소통하기에 좋은 방법이라고 주장 할 수는 없지만 그것이 우리가 가진 것입니다. 그러나 이것이 우리가 가진 전부는 아닙니다. 이메일/Github PR에 대한 토론/IRC #php.pecl …
  • 투표에 참여하는 사람이 PHP 커뮤니티를 대표하지 않는다는 의견에는, 투표권을 받기 위해 노력하기 힘들 정도로 시간이 없다면 책임감있게 공헌할 시간이 없는 것일 수도 있습니다. internals가 아닌 리드 프레임웍 개발자 등에 투표권을 부여하는 제도도 있고, 일부는 참여하고 있습니다.

다시 Brent Roose가 응답합니다. - Reply to Joe

  • P++을 언급했지만 그전부터 이 글을 준비 했으며, 그걸 파벌이라고 부르든 아니든 큰소리가 들립니다. 예를 들어, Reclassifying engine warnings, Short open tags, Namespace-scoped declares, Explicit call-site send-by-ref syntax, Deprecations for 7.4…
  • 항상 이런 식으로 진행됩니다. Nikita는 언어를 앞으로 진전시키려고 하고, Zeev와 Stas는 언어 호환성을 지키려 하고, Sara는 중간 지점을 유지하려고 하고, Dmitry는 어딘가에서 PHP 8을 연구하고 있습니다.
  • 규칙을 지키는 것이 중요하다고 말하고 있지만, 그건 낡은 방식의 규칙이고 이제는 우아하고 현대적인 규칙이 필요합니다.
  • 핵심 기고자는 많지 않으며 동일한 토론을 읽고 답장하는 데 많은 시간을 소비해야합니다.
  • 언급했던 그 모든 채널로도 핵심 개발자와 사용자 개발자 간의 격차를 해소하지 않는 것 같습니다.
  • 토론에 참여하고 싶어도 본인(Brent Roose)조차 그 방법이나 대상이 누군지 명확히 알기 어렵고, 이것이 소통이 실패한 하나의 예입니다.

이 논쟁이 영향을 줬는지는 확실치 않지만, 이후 (이번 달 PHP internals에도 소개된 것처럼) Nikita가 Github 기반의 RFC workflow 제안하기도 했습니다.

One interesting thought from Joe

https://twitter.com/krakjoe/status/1167459152786087936

위에서 논쟁을 벌였던 Joe Watkins가 올린 트윗입니다.

PHP 에코시스템에서 가장 중요하지만 부족한 것은, generics나 typed variables이 아니라 펀딩이다. Xdebug, PHPUnit, composer처럼 그들이 현재 무료로 제공하는 것들에 계속 노력할 수 있게 하는 것은 너무나 중요하다.

따라서 당신이 PHP를 사용하고 있다면, 커뮤니티에 되돌려주거나 당신이 쓰는 툴의 개발자들을 지원하는 것을 고려해보세요. 여기 당신이 관심을 가질 만한 몇가지 펀딩 사이트가 있습니다.