Rasmus によって提出された RFC によると、PHP5.4 では、新しい信号処理メカニズムが導入されており、その目的は、信号シールド メカニズムをあらゆる SAPI に適用できるようにし、プロセスにおける PHP のパフォーマンスを向上させることです。
新しいメカニズムは zend シグナルと呼ばれます。その概念は Yahoo の「Yahoo シグナル遅延メカニズム」に由来しており、Facebook は、PHP+Apache 1.X の ap_block/ap_unblock のパフォーマンスを向上させるために、この概念を PHP に追加しました。
詳しくご紹介する前に、この新しい仕組みを導入した背景をご紹介します。私は以前にタイムアウト信号による PHP クラッシュの事例を紹介する 2 つのブログを書きました: PHP のメモリ管理の深い理解、低確率のコア分析、低確率の PHP コア ダンプ、その中で実際にこう言いました。 , PHP 主要な操作中に、HANDLE_BLOCK と UNBLOCK_INTERRUPTIONS という信号シールド メカニズムが予約されています。ただし、これら 2 つのマクロは単なるフックであり、現在、Apache 1.x の SAPI のみがこの 2 つのマクロを実装しています。つまり、ap_block と ap_unblock を使用します。
「確率の低い PHP コアダンプ」で説明した状況の場合、それを解決するためにエラーが発生するたびにマスク/マスク解除のシステムコールを導入すると、パフォーマンスが低下するのは明らかです。問題は十分に解決されていません。
したがって、zend シグナルのメソッドは次のとおりです。
1. Zend エンジンが起動すると、次のシグナルの信号処理関数が登録されます: SIGALRM、SIGHUP、SIGINT、SIGQUIT、SIGTERM、SIGUSR1、SIGUSR2、SIGPROF (*nix の下) これらのシグナルにすでに処理関数がある場合は、古いハンドラー関数。
2. シグナルが発生すると、zend_signal_handler_defer はまず、シグナルが現在ブロック領域内にあるかどうかを判断し、存在しない場合は、シグナルに対応する古い処理関数が呼び出されます。 HANDLE_UNBLOCK_INTERRUPTIONS まで待機し、信号処理関数を呼び出す前にブロック領域を終了します。複数のシグナルが発生した場合、シグナルはキューに入れられて待機します。
3. zend 信号は、zend_signal_globals_t. Depth カウントを使用して、HANDLE_BLOCK がインクリメントされ、HANDLE_UNBLOCK_INTERRUPTIONS がデクリメントされます。zend_signal_globals_t. Depth が 0 より大きい場合は、ブロック内にあることを意味し、そうでない場合はブロック内にないことを意味します。これにより、パフォーマンスが保証されます (以前の呼び出しを回避し、信号をブロックする)。
さらに、zend signal は、PHP 用の新しい信号処理登録インターフェイス zend_signal.
を提供します。
詳細については、[RFC]Zend Singalを参照してください。
zend シグナルの導入を背景に、記事の冒頭で述べたタイムアウトシグナルがクラッシュを引き起こす可能性がある問題をついに解決しました: #60038 (5.4 のみ)。
ただし、注意してください: PHP 5.4 はまだ開発段階にあり、最終リリース前に新機能が調整または変更される可能性があります。ご提案があれば、PHP の改善に役立つフィードバックを歓迎します。