PHP 7.1からデフォルトで有効になる「Zend Signals」とは何か


下記PHP Internals MLでの議論によれば、今後「Zend Signals」がデフォルトで有効になる予定です。少なくとも7.1.0beta2時点では有効になっており、特に問題が見つからなければこのままリリースされるはずです。

で、Zend Signalsって何?

「Zend Signals」または「Zend Signal Handling」というのはZend Engineの内部的なシグナルハンドリングの仕組みです。PHP言語の世界に新たな関数を追加するようなものではありません。

この有効・無効はphpinfo()で確認することができます。

先ほど紹介したML上での議論によれば、ざっくり次のような話のようです(かなり端折ってます)。

Dmitry「Zend Signalsを有効にすればOPcacheのシグナルハンドリングがマシになって、共有メモリに変なデータが残らないようにできる」
Dmitry「さらに"safe execution timeout"の導入でZend Engineでの余計なチェックが要らなくなる」
Dmitry「今日Zend Engineの無駄なチェックを外して、OPcacheに少しチェック足したりした」
Dmitry「なので、Zend Signalsをデフォルト有効にしたいんだけど」
Rasmus「賛成。それ入れたら7.0でセグフォ出るの治ったりしないかな」

サラっとRasmusが爆弾発言をしている気がします。7.0を高負荷環境で使っている方は要チェックかもしれません。

資料らしきもの

下記RFCによれば「Zend Signals」は5.4時代から実装されていたようですが、みんな存在すら忘れてたのを今回掘り起こして流用したような感じなんでしょうか。

正直なところ、このRFCを読んでもよくわからん印象ですよね…。

php.ini設定

Zend Signals有効だとzend.signal_checkという設定値が増えます。

zend.signal_check boolean
置き換えられたシグナルハンドラを、シャットダウン時にチェックします。

http://php.net/manual/ja/ini.core.php#ini.zend.signal-check

マニュアルの説明だと完全に意味がわからないんですが、PHPのスタートアップ時に設定したシグナルハンドラがシャットダウン時に置き換えられていないかをチェックして、万一置き換えられていたら警告を出すという機能のようです。Zend Signals自体のデバッグ用といった感じでしょうか。

まとめ

この修正により、PHP 7.1以降でOPcacheまわりの安定性が増しているのかもしれません。全体的に謎が多めの印象です。