php pcntl_signal は、デフォルトでは、pcntl が中断されたシステム コールを自動的に再起動するため、効果がありません。外部パフォーマンスとして、システム コールは中断できません。解決策は、システム コールを再起動しないように設定することです。
この記事の動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター
こんな場合はどうすればよいですかphp pcntl_signal が動作しません?
php pcntl_signal の使い方と注意点
最近、php をベースにマルチプロセスサーバーを構築する必要があります。正常に再起動するには、kill によって送信された SIGTERM シグナルをキャプチャする必要があるため、pcntl_signal が使用されます。
最初、キャプチャされた信号が無効であり、信号処理機能に入力できないことがわかりました。ドキュメントを読んだところ、declare(ticks = 1) を実行する必要があることがわかりました。説明には、クロックを生成するためなどと書かれていますが、私の理解は水晶発振器に似ています。追加後、親プロセスはシグナルを受信できるようになります。
しかし、子プロセスはまだシグナルを受信できません。長時間確認しましたが、例外は見つかりませんでした。子プロセスは通常、socket_accept をブロックします。ここでシステム コールを中断できないのではないかと思い、 while 1 ループに変更すると、正常に割り込み処理関数に入ることができました。
そこで調べてみると、pcntl はデフォルトで中断されたシステムコールを自動的に再開するようになっており、外部のパフォーマンスとしてはシステムコールを中断できないことが分かりました。
今マニュアルを見返してみると、pcntl_signal には 3 番目のパラメータがあり、これもオプションのパラメータで、システムコールを自動的に再起動するかどうかを決定することができます。 。
pcntl_signal 関数の概要
(PHP 4 >= 4.1.0、PHP 5、PHP 7、PHP 8)
pcntl_signal — 信号プロセッサをインストールする
説明
pcntl_signal(int $signo, callback $handler, bool $restart_syscalls = true): bool
関数 pcntl_signal() は、signo で指定された信号用の新しい信号プロセッサをインストールします。
パラメータ
signo
シグナル番号。
handler
シグナル ハンドラーは、ユーザーが作成した関数またはメソッドの名前にすることも、システム定数 SIG_IGN (注釈: シグナル ハンドラーを無視する) または SIG_DFL (デフォルトのシグナル) にすることもできます。
注:
オブジェクト メソッドを使用すると、オブジェクトの参照カウントが増加するため、他の処理に変更するかスクリプトが終了するまで保持されることに注意してください。
restart_syscalls
シグナルの到着時にシステム コールの再開を利用できるかどうかを指定します。 (訳注:情報を確認したところ、このパラメータは、システムコールがシグナルによって中断されたときに、システムコールを最初からやり直すかどうかを意味します。ただし、 http://bugs.php.net/bug.php?id によると) =52121、このパラメータはバグがあるため無効です。)
以上がphp pcntl_signal が効果がない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。