0

私はこれを達成したい:

デーモンが SIGHUP を取得した場合は、プロセスを (子として) 再度実行し、親を強制終了します。

私がそれを実行しているとき、初めて働いています:

> php test.php
> kill -HUP pid
> ps -ef |grep test.php
> result:... newPID test.php

問題は、子プロセスを強制終了している場合、関数がトリガーされないことです

> kill -HUP newPID
> ps -ef |grep test.php
> result: ... newPID(the same) test.php

コード:

test.php:
<?php
   declare(ticks = 1);

   $mypid = posix_getpid();

   function sig_handler()
   {

   Global $mypid;
   echo "Received sighup, we need to reload ourselves now \n";
   echo "mypid:$mypid \n";
   system("(php test.php)>/dev/null &");

   posix_kill($mypid,9);

   }

   pcntl_signal(SIGHUP,  "sig_handler");

   sleep(500);

   ?>

このコードは PHP 5.2.9 では機能しますが、PHP 5.3.5 では機能しません。そのバージョンでも動作させる方法はありますか?

ありがとう!

ロニー

4

2 に答える 2

0

PHP のシグナル ハンドラーは再入可能ではありません。そのため、シグナル ハンドラ内から fork/spawn するプロセスは、それ自体がシグナルに応答することはできません。私の知る限り、この動作は一貫しているため、その正確なコードが PHP 5.2.9 で機能するかどうかの詳細を確認したいと思います。

それで、あなたは何ができますか?

多くの場合、最良のオプションは、アプリケーションで定期的にポーリングするシグナル ハンドラー内に $signal_recd フラグを設定することです。

私は、かなり人気のある PHP Daemon Library の作成者ですhttps://github.com/shaneharter/PHP-Daemon

私があなただったら、その上でアプリをビルドし、自動再起動などについて心配させます。

于 2012-08-25T02:11:48.833 に答える
-1

ここでの私の疑いは、これが PHP のバグであるということです。私はまだ絶対的な確信を持って確認しようとしていますが、現状では同じ問題を抱えています.

子プロセスを起動してシグナルを送信すると、子プロセスがシグナルを受信して​​処理します。その後、親スクリプトから別の子プロセスを再起動し、別のシグナルをフォローアップすると、子プロセスは 2 番目のシグナルを受信しません。PHP 5.3.10 でこの問題を回避する方法を見つけるために微調整、いじり、苦労しましたが、役に立ちませんでした。

于 2012-03-15T21:40:11.177 に答える