インフィニットループ仙台支社のプログラマー、いがらしです。
PHP 界隈の気になったことをまとめ、月一くらいで宮城県仙台市からお送りします。
※ なお、画像のPHP ロゴは作者の Colin Viebrock さんによってリリースされ、CC BY-SA 4.0 でライセンスされているものです。
GitHub で見かけたプロジェクト
- コードフォーマッタ Prettier の開発中 PHP プラグイン
- まだ alpha 版
- Atom や Visual Studio Code、Vim との統合もある
- コードのリファクタリングや言語/フレームワーク/ライブラリのバージョンアップへの追従を自動で行うためのツール
- PHP-Parser を利用
- 静的解析でコードの依存関係を検査し、可視化やレイヤ間のアクセスルール違反の検出を行うツール
- プロジェクト内で使われていない composer 依存を見つけるツール
- ユーザから送られた HTML をサニタイズするライブラリ
- Xdebug がリモートデバッグに使うプロトコル DBGp のプロクシサーバ
- DBGp プロクシ自体は元々 Python での実装があったが、Amp を使い PHP で実装されているのが特徴
- 使い道は幾つかありえる
- Python 製のものでも達成されていた複数人で同じマシンの同じコードをデバッグする使い方
- include 時のコード書き替えによるモックライブラリ soft-mocks と組み合わせると、書き換え前のコードでのデバッグが可能に
- 連想配列として構造化されたデータからオブジェクトを生成するクラス
- クラスのインスタンスになるため、生の連想配列を使うとできない IDE の静的解析/補完を活用できるようになる
- ネストしたオブジェクトの生成もサポート
- 継承して使い、コンストラクタ内で Reflection を使ってプロパティを埋める実装
- 解説記事 がある
- http://php-decimal.io/
- 任意精度の浮動小数点数計算を行うための拡張
- Python 3 の decimal module と同様 mpdecimal というライブラリを利用
- internals で bcmath の置き換えとして話が出ていたもの
- ACL, RBAC, ABAC のような複数のモデルをサポートしたアクセスコントロールライブラリ
- PHP 用のサーバレスフレームワーク bref
- 今のところ AWS Lambda で使える
- return true to win で使われ、その際のケーススタディの記事が先日公開された
- 最初の月に 40 万 HTTP リクエスト、65 万回の Lambda 実行で、3 ドルかかったらしい
- 脆弱性の動的検出ツール
- PHP の文字列変数へタグを付け、ほとんどの関数やクラス、オペコードをフックできる xmark 拡張を利用
- taint と payload の 2 つのモードを持つ
- taint は laruence/taint と同様に動き、ユーザの入力値が system() のようなシンクポイント(脆弱性を引き起こす処理)へ渡されるのを検出
- payload は実際にペイロードを送りつけてシンクポイントを監視するモード
- 検出された脆弱性は Sentry へ収集できる
- Amp ベースで並列処理を行うためのライブラリ
- 先日 1.0.0 がリリースされた
- Swoole を使って書かれた MySQL のプロクシ
- コネクションプールと読み書きの分離をサポート
- HandshakeV10 をサポート
- Web Assembly のコードを PHP から直接実行できるようにする拡張を Rust で書く、という実験的プロジェクト
- Rust で書いたライブラリを C API として拡張から呼び、PHP で扱う構成
- 同じ人が FFI 経由で Rust のコードを呼び、Gutenberg の投稿フォーマットをパースする記事を書いており、こちらも面白い
最近のinternals
[RFC] [VOTE] Preloading
- https://externals.io/message/103421
- Preloading の RFC の投票
- 7.4 向けで 48:0 で可決
- RFC のステータスは Voting のまま更新されていないが、すでに master へマージ済
[RFC][VOTE] Password Digest Mechanism Registry
- https://externals.io/message/103426
- Password Hashing Registry の RFC の投票
- PHP 7.4 向けで可決済
password_*()
系の関数はアプリケーションでパスワードをハッシュする標準的な方法を提供するために導入- ハッシュ用のアルゴリズムは処理系コンパイル時に利用できるライブラリで固定となっていた
- 拡張向けの内部 API 追加により、アルゴリズムの拡張からの追加登録が可能となった
[RFC] [VOTE] Improve openssl_random_pseudo_bytes()
- https://externals.io/message/103415
- 疑似乱数生成用関数 openssl_random_pseudo_bytes() を改善する RFC
- PHP 7.4 向けで可決済
openssl_random_pseudo_bytes()
は失敗時に false を返していたが、例外を投げるようになる- 元は
openssl_random_pseudo_bytes()
を random_bytes()の実装へのエイリアスとする案が出ていた - が、それも混乱を招きそうな対応であり、OpenSSL での疑似乱数実装を捨てる理由もない、といった議論を経て、今回の修正となった
[RFC] Spread Operator in Array Expression
$parts = ['apple', 'pear']; $fruits = ['banana', 'orange', ...$parts, 'watermelon']; // ['banana', 'orange', 'apple', 'pear', 'watermelon'];
Branch off PHP-7.4 early
- https://externals.io/message/103436
- PHP 8 に備え、ブランチ管理をどうするかの議論
- 通常 PHP は alpha を過ぎる頃にフィーチャーフリーズ、beta をリリースする頃にそのバージョンのブランチを master から切る
- 新機能の開発は常に master ブランチに取り込まれ、下位バージョンでのバグ修正も master へ取り込まれる
- 乖離が大きくなり得る PHP 7.4 と 8.0 で 2 つのブランチを同時に進行するのは作業負担がある
- 来年 1 月中頃に PHP 8 用のブランチをフィーチャーブランチとして切り、PHP 8 用ブランチへの継続的な取り込みが難しくなる大きな変更は master(この時点では PHP 7.4 用作業ブランチ)へ入れないようにする案が出ている
[RFC][Discuss] Covariant return- and contravariant parameter- types
- https://externals.io/message/103511
- 返り値の共変と引数の反変をサポートする RFC が Under Discussion に
- これまで返り値型宣言なしのメソッドを型宣言ありのメソッドでオーバーライドしたり、引数の型宣言ありのメソッドをなしのメソッドでオーバーライド(PHP 7.2 以降)することは可能だった
- 子で親より広い型を引数で受け付ける宣言、子で親より狭い型を引数で返す宣言は型安全であるにも関わらず、これまでの PHP では型エラーとなっていた
- 提案が受理されれば上記のようなコードもエラーなしに書けるようになる
最近の FIG
[PSR-5] Intersection Types
- https://groups.google.com/forum/#!topic/php-fig/W1VyAtoqGQ8
- PSR-5 の 交差型の記法について、
|
と&
を同時に型指定に使うことを不許可にすべきという意見が出ている A|B|C
やA&B&C
は許容、A|B&C
のような指定や括弧での優先度指定は不許可というもの- そもそも複雑な指定が本当に必要か、PHP 自体に代数的型が入った際に不整合が出ないか、といった観点
- 別途 PR を立てて議論を継続する予定
Remove Symfony
- https://github.com/php-fig/fig-standards/pull/1120
- Symfony の創設者 fabpot さんより、FIG のメンバーから Symfony を外すという PR
- FIG からの脱退意思を表明するもの
- fabpot さんは最近の FIG は相互運用性を目指すものではなく、ある種の思想にもとづいたフレームワークの 1 つを作ろうとしているに過ぎない、という意見を Twitter へ投稿している
イベント情報
PHP カンファレンス 2018(開催日: 2018 年 12 月 15 日)
PHP カンファレンス仙台 2019(開催日: 2019 年 1 月 26 日)
- スピーカー募集を締め切り
Laravel JP Conference(開催日: 2019 年 2 月 16 日)
PHPerKaigi 2019(開催日: 2019 年 3 月 29 日 ~ 31 日)
先日 PHP 7.3 RC6 がリリースされました。最後の RC 版の内容をそのままリリース版とするリリースプロセスのため、何事もなければ、この内容で来月はじめの方には 7.3 正式版がリリースされることとなりそうです。
Phoronix にて旧バージョンと比較したベンチマークが公開されており、今回のリリースでも引き続き良好な性能向上を果たしているようです。
PHP 7.3 には RFC を通して導入された新機能の他、実は複数の trait から同じ trait を use する際に衝突が起きる問題の修正という、使い勝手への影響が結構大きそうな修正もこっそり入っています。
trait から trait を use する作り方が案外気軽にできない、と悩んでいた方は、試してみるといいかもしれません。
PHP 7.1 は 12 月 1 日にアクティブサポート期間を終え、6 日に予定されている 7.1.25 のリリース後は通常のバグ修正は行われず、セキュリティ修正のみがリリースされることとなります。
また、PHP 7.0 は 12 月 3 日に、 PHP 5.6 は 12 月 31 日に公式のセキュリティサポート期間を終えます。
Packagist のブログ記事によると、composer install が送る User-Agent の PHP バージョンは 7.1 以上のものが増えているそうです。
一方、phpVatch には多くのサーバがいまだ PHP 7.0 以下で動いているというデータもあります。
また、PHP 7.0 は 12 月 3 日に、 PHP 5.6 は 12 月 31 日に公式のセキュリティサポート期間を終えます。
Packagist のブログ記事によると、composer install が送る User-Agent の PHP バージョンは 7.1 以上のものが増えているそうです。
一方、phpVatch には多くのサーバがいまだ PHP 7.0 以下で動いているというデータもあります。
今、皆さんのサーバではどのバージョンの PHP が使われていますでしょうか。