PHPは、デーモンプロセスを直接起動および終了することもできます。シェルと比較して、それははるかにシンプルで、理解する方が便利です。もちろん、PHPデーモンが自動的に再起動する必要がある場合、シェルのクロンタブスケジュールに依存します。スクリプトを時々実行して、スクリプトを再起動する必要があるかどうかを確認します。必要に応じて、プロセスを殺し、Runfileファイルを削除し、RunFileファイルにPIDを再起動して書き込みます。
コードコピーは次のとおりです。
<?php
function start($ file){
$ path = dirname(__ file __)。 '/';
$ runfile = $ path。$ file。 '。run';
$ diefile = $ path。$ file。 '。die';
$ file = $ path。 "data/{$ file} .php";
ClearStatCache();
if(file_exists($ runfile))){
$ oldpid = file_get_contents($ runfile);
$ nowpid = shell_exec( "ps aux | grep 'php -f process.php' | grep $ {oldpid} | awk '{print $ 2}'");
// RunfileのPID数が実行中のものと一致し、最後にRunfileにアクセスするときと現在の違いが5分未満の場合の違いがある場合は、戻ります
if(($ oldpid == $ nowpid)&&(time() - fileatime($ runfile)<300)){
echo "$ file is circle running no";
戻る;
}それ以外{
// PID番号が一致しないか、ループステートメントが300秒間実行されていません。プロセスを殺して再起動してください
$ pid = file_get_contents($ runfile);
shell_exec( "ps aux | grep 'php -f process.php' | grep {$ pid} | xargs-if-no-run-empty kill");
}
}それ以外{
//ファイルpidを実行ファイルに書き込みます
if(!($ newPid = getMypid())||!file_put_contents($ runfile、$ newPid)){
戻る;
}
while(true){
//新しいエンドプロセス番号を受信し、プロセスを終了し、関連するファイルを削除します
if(file_exists($ diefile)&& linnink($ runfile)&& link($ diefile)){
戻る;
}
/*これはデーモンがする必要があることです*/
file_put_contents($ file、 "I'm Running now" .php_eol、file_append);
/**********************/
touch($ runfile);
睡眠(5);
}
}
}
start( "test");
HPでデーモンを書くときに注意を払うためのいくつかのポイント:
1.最初のことは、関数ClearStatCache()関数です。公式マニュアルを見ると、この関数がファイルステータスキャッシュをクリアすることがわかります。スクリプトで同じファイルのキャッシュステータスを複数回チェックすると、関数が使用されない場合はエラーが発生します。影響を受ける関数は、stat()、lstat()、file_exists()、is_writable()、is_readable()、is_executable()、is_file()、is_dir()、is_link()、filectime()、fileatime()、filemime()、fileinode()、filegrup fileperms()。
2。スクリプトが複数回実行されると、実行する前に検出されます。最後のループの時間距離は300秒を超えるか、PID数が一致しないようになりました(各ループ実行で時間を更新する必要があります)。
3.自動再起動は、Crontabのスケジュールも使用し、スケジュールにファイルを追加します。
コードコピーは次のとおりです。
crontab -e
#スケジュール、挿入図モードを開始します
*/3 * * * */usr/bin/php -f process.php
#3分ごとに除外して、プロセスを掛けます
これは基本的に大丈夫です。特定の関数がある場合は、コードを変更する必要があります。