インフィニットループ仙台支社のプログラマー、いがらしです。
PHP 界隈の気になったことをまとめ、(たぶん)月一くらいで、宮城県仙台市からお送りします。
今回は最近 GitHub で見かけて気になった PHP プロジェクトと、PHP の言語開発者メーリングリストである internals の議論をつまみ食いして紹介します。
※ なお、画像のPHP ロゴは作者の Colin Viebrock さんによってリリースされ、CC BY-SA 4.0 でライセンスされているものです。
GitHub で見かけたプロジェクト
https://github.com/slince/spike
- ReactPHP で書かれたリバースプロキシ
- TCP/HTTP のトンネルを作れる
https://github.com/webonyx/graphql-php
- GraphQL の JS 版参照実装を PHP へ移植したもの
- GraphQL は Facebook 発の API 問い合わせ言語
https://github.com/thephpleague/flysystem
- ファイルシステムの抽象化ライブラリ
- ローカルのファイルアクセスやリモート、ZipArchive などを透過的に扱える
- Laravel に標準添付されているが、他フレームワークでも使える
https://github.com/TechEmpower/FrameworkBenchmarks
- 各種 Web フレームワークのベンチマーク
- ベンチマークコードについてユーザからの PR を受け付けている
- ベンチマーク環境/内容への最適化度合いには各フレームワークでバラつきがある
- 真面目に技術選択の材料にするのは少し注意が要りそう
- PHP の非同期フレームワーク Swoole が面白い結果を出している
- JSON encode が極端に速い
- 内容的に実行されるコードがほとんど C 言語コードになるので、当然といえば当然な面はありつつ
- DB 絡みのベンチマーク結果が妙に悪いのが気になる
- ベンチマークコードで DB を同期呼び出ししていたのかも
- JSON encode が極端に速い
https://github.com/filp/whoops
- エラー/例外取り扱い用ライブラリ
- Laravel に標準添付されているが、他フレームワークでも使える
https://github.com/nunomaduro/collision
- whoops を使い、CLI での実行時にエラー箇所を分かりやすく表示できるライブラリ
https://github.com/tenancy/tenancy
- マルチテナントのサービスを作るためのライブラリ
- 1つの Laravel インストールで複数ドメイン用のアセットや DB を持てる
https://github.com/nesk/puphpeteer
- PHP の Puppeteer ブリッジ
- Puppeteer は Node.js から Chrome のヘッドレスブラウザを操作するライブラリ
- PHP から Node.js のライブラリを叩くライブラリ Rialto を使い、PHP から Puppeteer を叩く
https://github.com/ethicalhack3r/DVWA
- PHP/MySQL を使った Web アプリ、Damn Vulnerable Web Application (DVWA)
- その名の通り、学習用にセキュリティ脆弱性が故意に埋め込まれている
https://github.com/walkor/Workerman
- 非同期イベント駆動フレームワーク
- pcntl_fork + プロセス管理 + イベントループ + ネットワークコード
- ReactPHP 周りの非同期 I/O スタックと組み合わせて使える
- 分散処理用の GatewayWorker や socket.io の PHP 版 phpsocket.io 等の土台となっている
https://github.com/dubbo/dubbo-php-framework
- PHP 用の RPC 通信フレームワーク
- Alibaba 製の Java 用マルチプロトコル対応 RPC フレームワーク Dubbo のプロトコルと完全互換
- Dubbo は先日 Apache のインキュベータプロジェクトになった
- 中国のオンライン消費者金融プラットフォームの会社である lexinfintech で2年以上使っていたものを OSS 化、という流れ
- Swoole/Zookeeper/Redisに依存
最近の internals
PHP7.3
Cleaning up unmaintained extensions [Accepted]
- https://externals.io/message/102282
- メンテナ不在の標準拡張を PECL へ移していくプロセスの提案
- 投票で可決され受理済
- 現在の拡張の状況は https://wiki.php.net/todo/extensions にまとめられている
- 実は gettext や readline(php -aで使われている)もメンテナ不在
- このあたりはメンテナがいないからといって単に標準添付から外せるか、というと微妙
- community-maintained のような特別扱いが必要かも
User-defined object comparison [Under Discussion]
- https://externals.io/message/102473
- オブジェクト同士の比較の挙動を変えられるようにするマジックメソッドの提案
- デフォルトの比較の挙動をオーバーライドする
- PHP5 以来のオブジェクト比較時のデフォルトの挙動は、各プロパティを再帰的に比較していくもの
- 現状のデフォルト挙動の以下のような点に対する問題意識にもとづく
- 比較結果がプロパティの並び順に依存する
- 比較が曖昧比較
- 不要/不都合な比較の発生
- 拡張なしの PHP コードではそれらの挙動を変更できない
Mixed Type [Under Discussion]
- https://externals.io/message/102536
- 型宣言で mixed を使えるようにする提案
- 挙動は型宣言なしと同じ
- 古くからのコードで単に型宣言が付けられていないだけなのか、意図して mixed としているのかを区別するためのもの
- doc comment でよいのでは、という意見も
- union 型が取り込まれる前に入れると、実際に「任意の」型を受け付けるわけではないものにも誤用されそう
Typed Properties v2 [Under Discussion]
- https://externals.io/message/102333
- nikic さんと bwoebi さんによる型付プロパティの提案
- かつて pthreads 等の krakjoe さんらが提案していたものの練り直し
- 参照や static プロパティのサポートなど、旧提案の頓挫原因への対処を盛り込んでいる
- 細かいエッジケースへの対処で、提案内容がやや大きくなっている
- ただ 7.3 の feature freeze まであまり時間のない時期に出されたため、時間的に十分な検討ができなさそう
- 7.3 を逃すと、2 年後の 8.0 まで入れるタイミングがない可能性も?
- 7.3 のリリース時期をずらしてでも入れる、という案も
PHP8
- https://externals.io/message/102415
- 7.3 の次は 8.0 を出そうという話が Zeev さんから
- 色々大きな変更を盛り込むのに 2020 年 9 月~12 月くらいまで必要という話も
- 8.0 の前に廃止予定機能の deprecation only な 7.4 を来年出すかも
- PHP8 では JIT、非同期対応、Preloading、FFI を入れようという話
JIT
- https://github.com/zendtech/php-src
- PHP の JIT コンパイラは2014年に概念実証が行われた
- 当時は典型的な Web システムのボトルネックは PHP の実行時間にはなく、大幅な性能向上にはならないという結論だった
- PHP7 でも上記は変わらない
- CPU バウンドな処理については非常に高速化される
- Web 以外での PHP 利用など、既存の PHP 利用システムの性能向上に限らず、新たなユースケースの創出につながるかも
- JIT のデモが youtube に上がっている
非同期対応
- PHP をよりマイクロサービス向きにする何かを入れたい
- 例えば長時間実行、非同期のよりよいサポート
- ReactPHP や Swoole が目指しているような部分
- 各拡張や Stream で非同期 I/O に対応していくと便利になるはず
- 7.3への取り込みを目指していた Fiber は今のところ頓挫しているものの、PHP の非同期フレームワーク Amp の開発者らがこれをベースにasync の提案を進めるかも
FFI(Foreign Function Interface)
- https://github.com/dstogov/php-ffi
- 拡張の追加開発なしに C/C++ 等のネイティブコードを利用するための機能
- AI や機械学習など、他言語で開発されていく各時代の最先端ライブラリを PHP から利用しやすくなる
- JIT と合わせて PHP 自体で PHP 拡張相当のものを作るなど、PHP のユースケースを広げられるかも
- 例えば PHP で機械学習フレームワーク TensorFlow のバインディングを作れるようになる
Preloading
- PHP の各 SAPI で、リクエストの処理を開始する前にクラスや関数を読み込んでおく機能
- 各種 PHP フレームワークはクラスファイルのオートロードなど、 bootstrap に多くの時間を費やしている
- FFI や JIT の有効利用という面でも役立つ筈
- Swoole や Workerman、PHP-PM など、リクエストごとの bootstrap を省いて PHP の処理を高速化する例が複数存在しており、先に紹介したWebフレームワークベンチマークで Swoole が好成績を出している理由の 1 つでもある、ということが念頭にあると、この機能の需要が分かりやすいかも
GitHub の人気リポジトリを見ていると、最近 Web サイト以外の用途に PHP を活用している例をよく見る気がします。PHP8 の機能追加も Web 以外の用途へ向かっている気がしますし、何か PHP の HTML 離れ、のような流れができているのかもしれません。
この「たぶん月刊PHPニュース」は月一くらいで出すのを目指していますが、PHP 7.3 に何が入るか、がこの 7 月中に決まる筈なので、ひょっとするとそのときまた記事を出すかもしれません。
インフィニットループでは、PHP の最新技術動向が気になるエンジニアを募集しています。
詳しくはこちらの求人詳細をご覧ください → 採用情報ページ (仙台支社特設ページはこちら)