PHPスクリプトをデーモンとして実行し続ける最良の方法と、再起動が必要かどうかを確認する最良の方法は何ですか.
24 時間年中無休で実行する必要があるスクリプトがいくつかあり、ほとんどの場合、nohupを使用して実行できます。しかし、ダウンした場合、自動的に再起動できるように監視する最善の方法は何ですか?
(適切な) init 構造を使用してこれを行うことができない場合 (共有ホスティングを使用している場合など)、cron を使用して、数分ごとにチェックするスクリプト (好きな言語で記述できます) を実行します。それらが実行されているかどうかを確認し、必要に応じて再起動します。
最も洗練されたソリューションはreactPHPです。
出力をメールにパイプすることでデーモンを実行します。
php daemon.php | mail -s "daemon stopped" foo@example.org
そうすれば、デーモンが停止したときに、デーモンがメールを送信し、その方法で通知されます。
もちろん、デーモンを手動で再起動することを意味しますが、すぐにわかります。通常、デーモンが停止した場合、それはとにかく世話をする必要がある何かが他にあることを意味するので、それは通常大丈夫です。
デーモンを再起動するための迅速でダーティなcron:
* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME
USERをデーモンが実行されるユーザーに置き換え、SCRIPTNAMEをスクリプトの名前に置き換えます。これを貼り付け/etc/cron.d/restart_php_daemon
ます。毎分実行する必要があります。*
最初のを*/2
また*/5
はより少ない頻度で実行するように変更します。
アップデート
これを独自のcrontabに入れる場合:
実行crontab -e
して追加:
* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME
デーモンは、バックグラウンドで実行される Linux プロセスです。apache または mysql はデーモンです。Linux 環境では、cronjob を使用してバックグラウンド プログラムを実行できますが、これにはいくつかの制限があり、シナリオによってはお勧めできません。たとえば、cronjob を使用すると、以前の実行がまだ終了しているかどうかを制御できません。多くの場合、プロセスをデーモンとして実行する方が便利です。
// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
// Only the parent will know the PID. Kids aren't self-aware
// Parent says goodbye!
print "Parent : " . getmypid() . " exiting\n";
exit();
}
print "Child : " . getmypid() . "\n";
上記のコードは、php でデーモンを作成する方法に関する非常に優れた記事から引用したものです。これはリンク先で読めます
wget を実行し、結果を共有サーバーの /dev/null に送信することに成功しました。
PHPベースのスクリプトを使用して、データベースから読み取り、電子メールを送信します(PEAR Mail_Queueライブラリを使用)。bashスクリプト内から実行し、返された結果( "exit $ status;"から)に基づいて、停止するか、X秒間スリープするか、すぐに再起動します。(メールシステムにストレスを与えないように、PHPスクリプトに負荷平均/スリープのチェックも入れました)。
継続的に実行する必要のある長期デーモンの場合、私は同意します。ただし、これを実行するのはおそらく最善の方法ではありません(ただし、長期間正常に実行されたソケットサーバーについて聞いたことはあります)。 PHP 5.3でもガベージコレクションが改善されました。スクリプトが計画外に終了しないように十分に記述されていれば、メモリの問題は以前よりはるかに少なくなるはずです。
PHP が最適なツールではないことには同意しますが、データベース アクセスなどのアプリケーションのコンポーネントを再利用できるように PHP を使用する理由は理解できます。
私は同様の問題を抱えていたので、PHPスクリプトを実行できるCで書かれたデーモンであるThe Fat Controllerを開発することになりました。また、スクリプトの多数のインスタンスを並行して実行するマルチスレッド デーモンとして実行することもできます。
詳細と使用例はこちら: http://www.4pmp.com/fatcontroller/
TBH、PHP はおそらくこれに最適なツールではなく、実際に設計されたものではありません。これを試すと、メモリリークやその他の悪いことが起こると聞いたことがあります。また、PHP には、スクリプトの実行ごとに限られた量のリソース ID (ファイル ハンドル、データベース接続など) しかないことにも注意してください。
私はこのような種類のアプリを実際に書いた経験はありませんが、Python や Perl など、他のものを使用する方が良いでしょう。