PHP Annotated – September 2020
Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated 2020년 9월호의 번역/해석본입니다.
이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.
⚡️ News & Releases
PHP 8.0.0 Beta 4
https://www.php.net/archive/2020.php#2020-09-17-1
계획에 없던 beta 릴리스가 있었습니다. JIT, named arguments, reclassifying more notices and warnings 등의 안정화를 위해 추가가 됐습니다. 그러나 11월 26일로 예정된 최종 릴리스 날짜는 아직 변경 계획이 없습니다. 이후 첫 RC(release candidate)는 10월 1일 입니다.
PHP 7.4.10, PHP 7.3.22
https://www.php.net/ChangeLog-7.php#7.4.10
https://www.php.net/ChangeLog-7.php#7.3.22
The future of Zephir and Phalcon
https://blog.phalcon.io/post/the-future-of-phalcon
PHP5 시절로 돌아가면, 성능을 개선하기 위해 C-extension을 사용하는 프레임웍이 유행이었습니다.
이 중 가장 인기 있었던 건 Phalcon framework이었고, Zephir라는 자체 언어도 사용할 수 있었죠.
안타깝게도 그 프로젝트에 가장 많이 기여한 사람 중 한명이 떠났고, 다음 릴리스인 Phalcon 5부터는 순수 PHP로 재작성하기로 했습니다.
PHP: Community Synergy Initiative
https://www.reddit.com/r/PHP/comments/ivpfcf/php_community_synergy_initiative/
Paul Dragoonis와 Christoph Rumpel은 PHP 커뮤니티와 생태계를 더 나은 곳으로 만들겠다고 다짐했습니다.
다음과 같은 몇 가지 중요한 문제가 있습니다
- 명확하지 않고 오래된 php.net의 댓글 영역
- 커뮤니티와 언어 관리자(maintainer) 간의 의사 소통 부족
- 새로운 기능에 대한 RFC 문서 외에 프로젝트에서 일어나는 일에 대한 투명성 부족
- 프로젝트에 새로운 사람이 부족
일을 더 진전시키기 위해, 이 두 사람은 전 세계의 PHP 친구들에게 익명 설문조사를 시작했습니다.
PHP for GraalVM concept
https://github.com/abertschi/graalphp
GraalVM 프로젝트는 다른 언어를 지원하는 Java 가상 머신의 대체제를 개발합니다. 실험적인 PHP 구현체는 아직 언어 기능의 일부만 지원합니다.
Computer Language Benchmarks Game에서의 종합 벤치마크 결과는 PHP 7.4에 비해 8배 이상의 성능 향상이 있었습니다.
The WordPress community discussed dropping support for old PHP versions
WordPress 커뮤니티에서는 오래된 PHP 버전의 지원을 중단할 것을 논의했습니다. 프로젝트 리드인 Matt Mullenweg의 답변에 따르면, PHP 5.6 버전은 오랫동안 지원될 것으로 보입니다. 공식 통계는 워드프레스 설치하는데 21.6%가 PHP 5.6 이하 버전을 사용한다는 것을 보여줍니다.
워드 프레스에서 MySQL을 채택한 경우에도 비슷한 그림을 볼 수 있습니다. 65%는 MySQL 5.6 이하를 사용하고 MySQL 5.5에 대한 지원은 이미 종료되었으며 5.6은 2021년 2월에 수명이 종료됩니다.
Composer 2.0 RC 1
https://github.com/composer/composer/releases/tag/2.0.0-RC1
사용 해보시려면, composer self-update --preview
실행해보세요.
🐘 PHP Internals
✅ [RFC] Shorter Attribute Syntax Change
https://wiki.php.net/rfc/shorter_attribute_syntax_change#voting
Attribute 문법에 관한 긴 논쟁이 끝났습니다. #[Attribute]
가 이겼습니다.
#[ |
이전 문법이었던 @@Attr
는 속성 그룹화를 해줄 수 없었으므로 PR에서 제거 됐습니다. 그러나 #[ ]
는 종료 마커가 있어 끝을 표시할 수 있기 때문에, 그룹화 기능이 돌아왔습니다.
// You can do this way |
Attribute에 관한 overview 포스트도 읽어보세요.
🆕 [RFC] any() and all() on iterables
https://wiki.php.net/rfc/any_all_on_iterable
이 RFC에서 Tyson Andre는 표준 라이브러리에 두 개의 function을 추가할 것을 제안했습니다.
any(iterable $input, ?callable $callback = null): bool
— 각 요소의 callback을 실행하며 처음 true
로 반환되는 시점에 멈춤
all(...)
- 모든 요소의 callback에서
true
를 반환해야 이 함수도true
를 반환
다음은 예시입니다.
// Before |
Runtime-erased generics proposal
https://externals.io/message/111875
Brent Roose가 - 그가 Laravel과 PHP에 관해 쓴 글들은 한번 쯤 보셨을 겁니다 -
제네릭을 PHP에 추가하는 아이디어를 내놓았는데, runtime에는 아무것도 체크하지 않습니다.
아래와 같이 generic을 사용한 코드가 있다고 해봅니다.
class Collection<T> { |
정적 분석기나 IDE는 이를 파싱하고 분석할 수 있겠죠. 그러나 PHP interpreter는 이를 무시하고 아래와 같은 코드를 실행하게 됩니다.
class Collection { |
이것은 Hack 언어에서 generic이 default로 동작하는 방식과 유사합니다. 예를 들어 Python에서는 대부분의 경우 타입에 대한 거의 모든 정보가 제거되며 인기있는 인터프리터에선 인수의 타입을 검증하지 않습니다.
🆕 Observer API
https://github.com/php/php-src/pull/5857
PHP 8에는 함수를 입력하거나 종료 할 때 추적할 수 있는 내부 API가 있습니다. 이는 Xdebug, profilers 그리고 New Relic, Tideways와 같은 APM 솔루션 등의 extension에 유용할 것입니다.
Author인 Levi Morrison과 Sammy K Powers가 참여한 🔈 PHP Internals News podcast #68에서 이 API에 대해 더 알아보세요.
🛠 Tools
Pest 0.3
https://nunomaduro.com/pest-v0-3-is-out/
PHPUnit 위에서 개발된, 테스트를 좀 더 간단한 방식으로 작성할 수 있는 툴입니다.
Pest IntelliJ라는 PhpStorm 플러그인도 있습니다.
Codeception/Verify 2.0
https://github.com/Codeception/Verify
Assertions for PHPUnit and Codeception with a fluent interface.
brick/money
https://github.com/brick/money
재무 데이터/화폐 단위를 다루는 라이브러리. GMP나 BCMath 설치 없이도 가능.
the comparison with moneyphp/money를 확인해보세요.
bassim/super-expressive-php
https://github.com/bassim/super-expressive-php
이 패키지를 사용하면 fluent 인터페이스를 통해 거의 자연어에 가까운 방식으로 정규 표현식을 작성할 수 있습니다.
$myRegex = SuperExpressive::create() |
또 다른 대안인 VerbalExpressions/PHPVerbalExpressions도 있습니다.
phpbench/phpbench 1.0.0-alpha1
https://github.com/phpbench/phpbench
코드 벤치마킹을위한 매우 편리한 도구입니다. 새 버전에서는 결과를 이전 실행과 비교하고 성능 모니터링을 위해 CI에서 사용할 수 있습니다. Learn more
jawira/emoji-catalog
https://github.com/jawira/emoji-catalog
3k+ emojis as PHP constants.
|
Symfony
Symfony 5: The Fast Track
“Symfony 5: The Fast Track”란 e-book이 이제 12개 언어로 제공합니다. 한국어로는 없습니다.
A Week of Symfony #716 (14-20 September 2020)
https://symfony.com/blog/a-week-of-symfony-716-14-20-september-2020
Laravel
Laravel 8 released
https://laravel-news.com/laravel8
자세한 overview 📺는 Laracasts에서.
Laravel authentication ecosystem overview
https://laravel.com/docs/8.x/authentication#ecosystem-overview
laravel/fortify를 둘러싼 혼란을 풀어주는 overview.
laravel/jetstream
https://jetstream.laravel.com/1.x/introduction.html
Laravel 8 릴리스에는 Livewire, Inertia.js 등에 기반한 스켈레톤 애플리케이션이 있습니다.
Common security mistakes in Laravel applications.
https://cyberpanda.la/ebooks/download/laravel-security?pdf=true
Laravel 어플리케이션에서 놓치기 쉬운, 보안을 위협하는 실수를 정리한 e-book입니다. 아래와 같은 내용을 다루고 Prevention tip도 제공합니다.
- SQL Injections
- SQL Injection via column name
- SQL Injection via validation rules
- SQL Injection via raw queries
- Validation Rule Injection
- Making the validation rule optional
- DDOS the server by creating an evil REGEX validation rule
- SQL Injection
- XSS(Cross-Site Scripting) in Laravel Blade
- XSS via
{!! $userBio !!}
Statement - XSS via a.href Attribute
- XSS via Custom Directive
- XSS via
- Mass Assignment Vulnerabilities in Laravel
- Not Protecting from Credential Stuffing Attacks
- Broken Access Control
- Missing HTTP Security Headers
- Not Tracking Vulnerable Packages in the Application
Write code that interacts with the data in a predictable and safe way
https://laravel-beyond-crud.com/sample-chapter
Laravel Beyond CRUD라는 책의 샘플 챕터입니다.
📺 Laravel Business — A YouTube channel with nice videos about the framework.
https://www.youtube.com/channel/UCTuplgOBi6tJIlesIboymGA/videos
Laravel 프레임웍에 관한 좋은 비디오가 많은 채널입니다.
Yii
yiisoft/auth
https://github.com/yiisoft/auth
Yii 3 제품군의 이 새로운 패키지는 다양한 인증 방법, 추상화 세트 및 인증을위한 PSR-15 미들웨어를 제공합니다.
yiisoft/strings
https://github.com/yiisoft/strings
Helpers for working with strings.
Yii news 2020, issue 6.
https://opencollective.com/yiisoft/updates/yii-news-2020-issue-6
🌀 Async PHP
Building the next generation react/http PSR-15 adapter using krakjoe/parallel
https://blog.wyrihaximus.net/2020/09/next-gen-react-http-psr-15-adapter/
이때, 이 어댑터를 통해 추가 된 미들웨어는 별도의 스레드에서 병렬로 실행되기 때문에 차단 될 수 있습니다.
Using ReactPHP to consume data from an HTTP API
https://mglaman.dev/blog/using-reactphp-consume-data-http-api
💡 기타 읽을 만한 글
Dialects in code: Part 1, Part 2
https://www.rosstuck.com/dialects-in-code-part-1
https://www.rosstuck.com/dialects-in-code-part-2
서로 다른 사람들이 완전히 다른 방식으로 동일한 프로그래밍 언어를 사용할 수있는 방법.
다양한 관행이 부딧히며 더 나은 관행(기존 관행에 잘 어울리고, 덜 복잡해보이며, 확실한 이점이 있는 등)을 선택해가는 방식을 설명합니다.
4 tips on refactoring in PHP
https://christoph-rumpel.com/2020/8/refactoring-php
- #1 - Be Expressive
- #2 - Return Early
- #3 - Refactor To Collections
- #4 - Consistency
How unserialize() works on PHP
https://vkili.github.io/blog/insecure%20deserialization/unserialize/
PHP에서 unserialize()의 동작 과정을 살펴봅니다. unserialize()의 취약성을 방지하기 위해선 JSON 데이터를 사용하거나 신뢰할 수 없는 사용자의 데이터를 unserialize()에 전달하지 않기를 당부합니다.
Modern PHP security
Part 1 — Bug classes
Part 2 — Breaching and hardening the PHP engine
Speeding PHP with FFI
https://dev.to/jorgecc/speeding-php-with-ffi-5gn0
Turbocharged PHP Development with Xdebug, Docker & PhpStorm
https://jump24.co.uk/journal/turbocharged-php-development-with-xdebug-docker-and-phpstorm/
On the impact of exceptions on performance
https://php.watch/articles/php-exception-performance
Exception이 성능에 미치는 영향. 요약하자면 try/catch 블럭은 약간의 영향이 있습니다. exception을 throwing하기 위해 stack trace를 모으고 객체를 생성하는 것 때문에 조금은 시간이 더 걸리지만, 상용 어플리케이션에서는 이것이 병목이 되는 경우는 없습니다.
Step-by-step instructions on how to contribute to opensource PHP package.
https://johnbraun.blog/posts/contributing-to-a-PHP-package
Step 1. Fork the package on GitHub
Step 2. Clone your fork
Step 3. Require the package within a (Laravel) project
Step 4. Commit your work
Step 5. Push your branch
Step 6. Create a new PR
📺 Videos
- Tobias Nyholm’s talk about async-aws/aws, an async client for AWS services.
- PhpStorm Tips with Christoph Rumpel: More productive development with code snippets a.k.a. Live Templates.
- Nikita Popov interviews Nikolas Grekas about Symfony compatibility with PHP 8.
- Using Xdebug’s Function Trace functionality for logging every function call with all arguments and return values. And one more video on how to use Xdebug profiler.
🔈 Podcasts
- PHP Internals News #67 — Derick Rethans talks to himself about the new
match
expression. - Voices of the ElePHPant interviews: