PHP7.1.0の新機能

[PHP7.3.0](https://qiita.com/rana_kualu/items/48e6e4baaeb265ab9fa7) / [PHP7.3.0α1](https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc) / [PHP7.1.0の新機能](http://qiita.com/rana_kualu/items/f8baf30752928346bef8) / [PHP7.1β1の新機能](http://qiita.com/rana_kualu/items/572494021917fbb93c95) / [PHP7.1α1の新機能](http://qiita.com/rana_kualu/items/476385b674d27339f911)

2016/12/01に[PHP7.1.0がリリースされました](http://php.net/archive/2016.php#id2016-12-01-3)。

PHP7.0からの変更点は既に[PHP7.1α1](http://qiita.com/rana_kualu/items/476385b674d27339f911)および[PHP7.1β1](http://qiita.com/rana_kualu/items/572494021917fbb93c95)で解説していて、その後はほとんどバグフィックスだったので新機能はほとんどないのですが、少しだけ追加になった[RFC](https://wiki.php.net/rfc#php_71)があったので紹介してみます。


## [RNG fixes and changes](https://wiki.php.net/rfc/rng_fixes)

PHPのランダム系関数の問題をどうにかする対応。

・とりあえず[rand()](http://jp2.php.net/manual/ja/function.rand.php)は論外なので、mt_rand()へのエイリアスにする。
・[mt_rand()](http://www.php.net/mt_rand)には[正しい乱数値を返さないバグ](https://bugs.php.net/bug.php?id=71152)があるため修正する。
・mt_rand()は引数によっては[奇数しか返さなくなる](https://3v4l.org/dMbat)みたいな[わりかし致命的なバグ](https://bugs.php.net/bug.php?id=45184)があるため修正する。
・[crypt()](http://www.php.net/crypt)など、内部でphp_rand()を使っている関数が一部あるため、php_random_bytes()に置き換える。
・[array_rand()](http://php.net/manual/ja/function.array-rand.php)にも[出力が偏るバグ](http://php.net/manual/ja/function.array-rand.php#117114)があるため修正する。

このあたりの問題は実は[前からわかっていた](http://sucrose.hatenablog.com/entry/2016/02/19/235506)のですが、PHP7.1に合わせてようやく修正となりました。

まあPHP7なら[random_int()](http://php.net/manual/ja/function.random-int.php)使えって話ですが。


## [Session ID without hashing](https://wiki.php.net/rfc/session-id-without-hashing)

セッションIDの生成方法にあった無駄なハッシュ関数を削除。

セッションIDは、これまではphp.iniで指定されたハッシュ関数を使って生成していました。
しかしPHP7では[CSPRNG](https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E8%AB%96%E7%9A%84%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0%E7%94%9F%E6%88%90%E5%99%A8)な[random_bytes()](http://php.net/manual/ja/function.random-bytes.php)が実装されたので、それを直接利用するようになりました。

それによって[session.hash_function](http://php.net/manual/ja/session.configuration.php#ini.session.hash-function)[session.hash_bits_per_character](http://php.net/manual/ja/session.configuration.php#ini.session.hash-bits-per-character)あたりのよくわからない設定が不要になったので削除されました。
かわりにセッションIDの桁数[session.sid_length](http://php.net/manual/ja/session.configuration.php#ini.session.sid-length)とセッションIDに使用可能な文字種[session.sid_bits_per_character](http://php.net/manual/ja/session.configuration.php#ini.session.sid-bits-per-character)という、二つのわかりやすい設定だけでセッションIDを制御できます。


## [Add session_gc()](https://wiki.php.net/rfc/session-gc)

これまでセッションのGCは、[session.gc_divisor](http://php.net/manual/ja/session.configuration.php#ini.session.gc-divisor)と[session.gc_probability](http://php.net/manual/ja/session.configuration.php#ini.session.gc-probability)を設定したあとは確率任せでしたが、任意のタイミングでGCを行う[session_gc()](http://php.net/manual/ja/function.session-gc.php)関数が追加されました。
返り値には削除したセッションファイル数が帰ってきます。
あると便利は便利だろうけど、どういうタイミングで使用するのかはよくわからない。


## [Add session_create_id()](https://wiki.php.net/rfc/session-create-id)

新たな関数[session_create_id()](http://php.net/manual/ja/function.session-create-id.php)を追加します。
これはセッションIDを作成します。
session_start()している場合は、他のセッションIDと重複しない値を作成してくれます。

で、セッションIDを作成するのはいいですが、それ以外は特に何もしません。
session_regenerate_id()のように自分のセッションIDを入れ替えたりとかそういう機能もありません。
やりたい場合は自力でsession_id()等を呼ぶ必要があります。

ちょっと何に使えばいいのかよくわからないのですが、特定のURLではセッションファイル名に独自のプレフィックスを付けたい場合などに使えるでしょうか。
あとランダム文字列生成機として便利なのではという気がしないでもない。


## まとめ

[3](http://qiita.com/rana_kualu/items/f8baf30752928346bef8)[記](http://qiita.com/rana_kualu/items/572494021917fbb93c95)[事](http://qiita.com/rana_kualu/items/476385b674d27339f911)合わせて読めば、これで貴方もPHP7.1マスター。

ここで紹介しているのはRFCに載った大きな変更点だけで、実際は他にも[小規模な変更](http://php.net/manual/ja/migration71.php)や[大量のバグフィックス](http://www.php.net/ChangeLog-7.php#7.1.0)も多々行われています。
本番環境をいきなりPHP7.1にするのは考えものですが、これからバージョンアップを考えている環境があるなら、PHP7.1も選択に入れてみてはどうでしょう。