インフィニットループ仙台支社のプログラマー、いがらしです。
PHP 界隈の気になったことをまとめ、月一くらいで宮城県仙台市からお送りします。
前回に引き続き、主に最近 GitHub で見かけて気になった PHP プロジェクトや、PHP の言語開発者メーリングリストである internals の議論などをつまみ食いして紹介します。
※ なお、画像のPHP ロゴは作者の Colin Viebrock さんによってリリースされ、CC BY-SA 4.0 でライセンスされているものです。
GitHub で見かけたプロジェクト
https://github.com/alhimik1986/php-excel-templator
- PHP Spreadsheet を使い、テンプレートとなる Excel データから別のデータを生成するライブラリ
https://github.com/TiBeN/CrontabManager
- crontab を PHP から管理するためのライブラリ
https://github.com/ankitpokhrel/tus-php
- レジューム可能なファイルアップロードを実現するプロトコル、tus の PHP 実装
https://github.com/hasegawa-tomoki/php-terminal-nes-emulator
- PHP 製のファミコンエミュレータ
- JS の bokuweb/flownes クローン、日本語記事がある
- PHP としては珍しく、激しく CPU を使うアプリケーション
- 遅いがコードは読みやすいので、高速化を試みると面白いかもしれない(面白かった)
https://github.com/thecodingmachine/safe
- PHP の組み込み関数について、失敗時に false を返すのではなく例外を投げるラッパーライブラリ
use function
で組み込み関数を呼び出す際の既存コードの実装を差し替えられる- 通常版の組み込み関数利用箇所を検知する phpstan 拡張も存在
https://github.com/infection/infection
- テストの効果測定器、ミューテーションテスト用フレームワーク
- テストコードとテスト対象コードを用意し、テスト対象コードを AST で操作したミュータントを複数作る
- テストを実行し、こければ kill、通れば escape とする
- 殺したミュータントの比率が低いなら、テストが対象コードの挙動を十分に検証していない可能性があるということ
https://github.com/Pinatra/Pinatra
- Sinatra の PHP クローン、DSL から Web サイトを生成
https://github.com/laravel-zero/laravel-zero
- CLI ツールを作るのに特化してパッケージされた Laravel 派生品
- Laravel の各種コンポーネントとあわせて利用でき、対話型メニューやデスクトップ通知のサポートもある
https://github.com/laravel/telescope
- Laravel 用のデバッグツール
- リクエストや例外、ログ、DBクエリ、キュージョブ、メールなど様々な情報を監視し、アプリケーションの挙動を確認できる
https://github.com/spatie/laravel-view-models
- Laravel で Controller から View へ渡す変数を整形するために View Model という階層を用意
- MVVM で知られるのと同名の用語だが、位置づけは異なる
- 実装方法は異なるものの、発想としてはかつて FuelPHP に同名で存在した構造(現在は Presenter に改名)と少し似ている
https://github.com/makasim/php-fpm-queue
- php-fpm を非同期処理用のキューとして扱うライブラリ
- queue-interop のインターフェースを実装
- 以前に tideways のブログ記事でも同様のアイディアが紹介されたことがある
https://github.com/spiral/roadrunner
- Go で書かれた PHP のアプリケーションサーバー / ロードバランサー / プロセスマネージャー
- PSR-7 互換の HTTP/HTTPS サーバを持ち、Nginx + FPM なセットアップを置き換えられる
https://github.com/SeasX/SeasLog
- ログ出力用の拡張
- log4php などの PHP で実装されたログライブラリより高速であることをうたっている
最近のinternals
[RFC] [VOTE] Typed properties v2
- https://externals.io/message/103148
- PHP 7.4 向けで型付プロパティの RFC が 70:1 で可決
- master へのマージはまだ行われていないが、いずれ PR:3313 がマージされるはず
RFC Result: Make the hash extension always available
- https://externals.io/message/103302
- PHP 7.4 での ext/hash の常時有効化の RFC の投票結果、30:0 で可決
- こちらは master にも取り込み済
[RFC] Preloading
- https://externals.io/message/103333
- Dmitry Stogov さんによる、PHP 8.0 の目玉機能として挙げられていた preloading の RFC
- PR: 3538 で作業中
- opcache の機能として実装
- 処理系の起動時に指定したファイルを読み込み実行、そこから更に他のコードを読み込める
- 読み込まれたコードは opcache のメモリ内に保持され、リクエストごとの読み込みが不要となる
- Zend Framework 1 の hello world で~30%、Zend Framework 2 版で~50% の性能向上
- ブートストラップのオーバヘッドがある程度の時間を占めるアプリケーション以外にはあまり効かず、マイクロサービス向き
- 将来的には同じく PHP 8.0 の目玉機能とされている JIT/FFI との組み合わせで、より効果を発揮する想定
[RFC] Kill proprietary CSV escaping mechanism
- https://externals.io/message/103268
- fgetcsv() / fputcsv() などの
$escape
パラメータを PHP 9 にかけて非推奨 / 廃止としていく提案 - 世界で広く使われている CSV はいまだ書式が標準化されておらず、ただし informational な文書として RFC 4180 がある
- RFC 4180 ではダブルクオートされた文字列内にダブルクオートを含む際は二重にする記載があるが、
$escape
相当の挙動は規定がなく、他言語でも$escape
相当の機能はない $enclosure
があれば$escape
は余分であり、問題を引き起こす場合もある- 現在
$escape
のデフォルト値は"\\"
- ASCII 非互換のエンコードで意図せぬエスケープが発生したり、
fgetcsv(fputcsv())
のようなラウンドトリップで失敗したりする - 多くのケースでは
$escape
に'\0'
を渡すことで期待通り動くが、バイナリを含むような CSV の読み書きでは失敗するかもしれない
- 現在
- PHP 7.4 で空文字列を渡してエスケープを無効化できるように、PHP 8 でデフォルトを空文字列に、PHP 9 で廃止と、段階的に進めていく提案内容
[RFC} Deprecate and Remove ext/wwdx
- https://externals.io/message/103164
- ext/wddx を非推奨 / 廃止とする提案
- WDDX は言語非依存のデータ交換フォーマットとして設計されたデータ形式だが、正式な標準化がされず、JSON など他のデータ形式の普及により重要度が下がった
- PHP 7.4 で非推奨とし、8.0 で PECL に移すという内容
- 7.4 の段階で非推奨とはしないまま PECL へ移してもよいのでは、という意見も
Unbundle libsqlite3?
- https://externals.io/message/103167
- 現在 PHP 処理系のソースコードへバンドルしている libsqlite3 のバンドルをとりやめとする話
- PHP 処理系は幾つかの外部ライブラリをバンドルしており、一部は処理系独自のパッチを当てて利用しているが、libsqlite3 は無修正で利用していた
- すでに master へマージされている
- PHP 処理系のソースコードからのビルドにはシステムのパッケージマネージャなどで別途 libsqlite3 の用意が必要となる
最近の FIG
[ENTRANCE] [VOTE] [CC] PHPDoc & PHPDoc Tags PSRs
- https://groups.google.com/forum/#!topic/php-fig/5Yd0XGd349Q
- PSR-5 の WG が再編され、また元々の PSR-5 は書式の PSR-5 と タグカタログの PSR-19 へ分割
- WG 再編により 交差型の導入や可変引数のサポート、nullable を ? で書けるようにする提案など、議論が活性化しているもよう
[ACCEPTANCE VOTE][CC] PSR-18 HTTP Client
- https://groups.google.com/forum/#!topic/php-fig/rScdiW38nLM
- PSR-18 が ACCEPTANCE VOTE に入った(UTC の 10/28 23:59:59 に〆切)
- 今のところ順調に +1 がついている
その他 PHP 界隈の情報など
The Future of the Zend Engine and the Zend Framework
- http://zsuraski.blogspot.com/2018/10/the-future-of-zend-engine-and-zend.html
- Zend の Ze である Zeev さんがチームメンバーとともに Rogue Wave 社を退職する
- チームメンバーには Zend Engine や Zend Framework へ貢献してきた主要メンバーも含まれる
- Dmitry Stogov さん
- Matthew Weier O’Phinney さん
- Enrico Zimuel さん
- Rogue Wave 社は 3 年前に Zend を買収したが、今後は Zend Server へ注力するよう方針を定めた
- 退職はすぐというわけではないものの、現在サポート企業を募集中
Wanted (Maybe?): New Maintainer
- https://github.com/sebastianbergmann/dbunit/issues/217
- PHPUnit の DbUnit がメンテナンスを終了
- 2019 年 2 月よりは前にプロジェクトをアーカイブ化する予定
- DbUnit は 2007 年に JUnit から移植された
- 現在はアクティブなメンテナが不在
- PHPUnit の Sebastian Bergmann さんと tideways の beberlei さんとの会話の中で、「プロジェクトに特化したフィクスチャ管理の方が楽」という話が出る
- 「そういえば最近同じ理由でDbUnitを人にすすめることもないな」と思ったとのこと
- ここ数年やっていたようなバグ修正の PR をマージするくらいのモチベーションも今はないそう
イベント情報
PHP カンファレンス 2018(開催日: 2018 年 12 月 15 日)
- 当日スタッフ募集中(10/31 まで)
PHP カンファレンス仙台 2019(開催日: 2019 年 1 月 26 日)
- スピーカー募集中(10/31 まで)
Laravel JP Conference(開催日: 2019 年 2 月 16 日)
- スピーカー募集中(11/30 まで)
- スポンサー募集中(現在ブロンズスポンサーの空き有り)
PHPerKaigi 2019(開催日: 2019 年 3 月 29 日 ~ 31 日)
- スポンサー募集中
型付プロパティの RFC が可決されました。導入される PHP 7.4 は来年のリリースで、多くの現場ではまだしばらく使えない機能となるでしょうが、今からだいぶ楽しみです。PHP 8 向けの改善も進んでいるようですが、エンジン改修の旗手である Dmitry さん(PHP 7.0 での劇的な高速化改修もされていた方)がフルタイムで開発に携われなくなってしまうと、開発速度にも影響が出るかもしれません。良い引き受け先が見つかるとよいのですが。
最近 JetBrains の PHPSTORM BLOG で、PHP Annotated Monthly という連載記事を見つけました。 かつては Gary Hockin さんが担当されていたようですが、今年の 2 月に BBC へ移籍されてからは連載が止まっていました。 8 月から新しく担当となった Roman Pronskiy さんは、ロシア語でも PHP についてのニュース記事を隔週連載されてきた方のようです。ロシア語は分かりませんが、Google 翻訳を頼りにそちらも読んでみるとけっこう情報源が被っていて、一方的に親近感を持ったりしています。
インフィニットループでは、PHP の最新技術動向が気になるエンジニアを募集しています。 詳しくはこちらの求人詳細をご覧ください → 採用情報ページ (仙台支社特設ページはこちら)