PHP7.3.0 / PHP7.3.0α1 / PHP7.1.0の新機能 / PHP7.1β1の新機能 / PHP7.1α1の新機能
2016/12/01にPHP7.1.0がリリースされました。
PHP7.0からの変更点は既にPHP7.1α1およびPHP7.1β1で解説していて、その後はほとんどバグフィックスだったので新機能はほとんどないのですが、少しだけ追加になったRFCがあったので紹介してみます。
RNG fixes and changes
PHPのランダム系関数の問題をどうにかする対応。
・とりあえずrand()は論外なので、mt_rand()へのエイリアスにする。
・mt_rand()には正しい乱数値を返さないバグがあるため修正する。
・mt_rand()は引数によっては奇数しか返さなくなるみたいなわりかし致命的なバグがあるため修正する。
・crypt()など、内部でphp_rand()を使っている関数が一部あるため、php_random_bytes()に置き換える。
・array_rand()にも出力が偏るバグがあるため修正する。
このあたりの問題は実は前からわかっていたのですが、PHP7.1に合わせてようやく修正となりました。
まあPHP7ならrandom_int()使えって話ですが。
Session ID without hashing
セッションIDの生成方法にあった無駄なハッシュ関数を削除。
セッションIDは、これまではphp.iniで指定されたハッシュ関数を使って生成していました。
しかしPHP7ではCSPRNGなrandom_bytes()が実装されたので、それを直接利用するようになりました。
それによってsession.hash_functionsession.hash_bits_per_characterあたりのよくわからない設定が不要になったので削除されました。
かわりにセッションIDの桁数session.sid_lengthとセッションIDに使用可能な文字種session.sid_bits_per_characterという、二つのわかりやすい設定だけでセッションIDを制御できます。
Add session_gc()
これまでセッションのGCは、session.gc_divisorとsession.gc_probabilityを設定したあとは確率任せでしたが、任意のタイミングでGCを行うsession_gc()関数が追加されました。
返り値には削除したセッションファイル数が帰ってきます。
あると便利は便利だろうけど、どういうタイミングで使用するのかはよくわからない。
Add session_create_id()
新たな関数session_create_id()を追加します。
これはセッションIDを作成します。
session_start()している場合は、他のセッションIDと重複しない値を作成してくれます。
で、セッションIDを作成するのはいいですが、それ以外は特に何もしません。
session_regenerate_id()のように自分のセッションIDを入れ替えたりとかそういう機能もありません。
やりたい場合は自力でsession_id()等を呼ぶ必要があります。
ちょっと何に使えばいいのかよくわからないのですが、特定のURLではセッションファイル名に独自のプレフィックスを付けたい場合などに使えるでしょうか。
あとランダム文字列生成機として便利なのではという気がしないでもない。
まとめ
ここで紹介しているのはRFCに載った大きな変更点だけで、実際は他にも小規模な変更や大量のバグフィックスも多々行われています。
本番環境をいきなりPHP7.1にするのは考えものですが、これからバージョンアップを考えている環境があるなら、PHP7.1も選択に入れてみてはどうでしょう。