ホームページ >バックエンド開発 >PHPチュートリアル >crond スクリプト実行時の同時実行競合の問題を解決する
crond 設定スクリプトは実行後、繰り返し実行されることがよくあります。たとえば、次のスクリプト:
<?phpsleep(70);?>
crond の設定項目が次の場合:
*/1 * * * * root php ./test.php
以前に実行された test.php が終了せず、新しい test.php が再度実行されたように見えます。以下の通り:
[hailong@vhost ~]$ ps aux | grep tt.php56667 5280 0.0 0.0 103388 4432 pts/2 T 08:06 0:00 vim ./test.phproot 5455 0.0 0.1 225288 8812 ? Ssl 08:08 0:00 /usr/bin/php /home/hailong/test.phproot 5665 5.0 0.1 225288 8748 ? Ssl 08:09 0:00 /usr/bin/php /home/hailong/test.php56667 5675 0.0 0.0 69460 852 pts/2 S+ 08:09 0:00 grep tt.php
プロセスが蓄積し続けると、システム リソースが枯渇し、システムがクラッシュする可能性があります。
解決策は 2 つあります。長所と短所。
この方法は、コードを変換することです。プロセス実行の有無の判定を追加します。たとえば、次のコード:
rrreeコードのロジックは非常に単純なので、ここでは説明しません。ファイルが存在するかどうかを判断するこの方法には問題があります。つまり、プログラムが最後まで実行されていない、つまり、以前に作成された mytest.lock ファイルが削除されていない可能性があります。これにより、将来的にプログラムが適切に実行できなくなります。
この問題を解決するために、コードを修正しました。ファイルが存在するかどうかの判断ではなく、プロセスが存在するかどうかが判断されます。変更されたコードは次のとおりです。
<?php $lockfile = '/tmp/mytest.lock'; if(file_exists($lockfile)){ exit(); }file_put_contents($lockfile, date("Y-m-d H:i:s")); sleep(70);unlink($lockfile); ?>
この方法には欠点があります。それは、ps コマンドを正確に記述する必要があることです。 test.php スクリプトを実行していないプロセスをカウントしないようにします。例:
vim を介して test.php ファイルを開きます。これにより、上記のコマンドが正しくカウントされなくなります。
さらに、なぜ $proc_num が 1 より大きいのではなく 3 より大きくなければならないのかについて考えることができます。理解できない場合は、WeChat 1798159444 に私を追加してください。
flock コマンドはファイル ロック機能を提供します。コマンドパラメータは次のとおりです:
$fp = popen("ps aux | grep 'test.php' | wc -l", "r");$proc_num = fgets($fp);if ($proc_num > 3) { exit;}sleep(70);
flock を使用して同時実行の競合を制御します。 crond 構成は次のとおりです:
[hailong@vhost ~]$ flock -hflock (util-linux 2.13-pre7)Usage: flock [-sxun][-w #] fd# flock [-sxon][-w #] file [-c] command... -s --shared Get a shared lock -x --exclusive Get an exclusive lock -u --unlock Remove a lock -n --nonblock Fail rather than wait -w --timeout Wait for a limited amount of time -o --close Close file descriptor before running command -c --command Run a single command string through the shell -h --help Display this text -V --version Display version
実際、flock の使用には落とし穴があります。落とし穴の詳細については、crond で flock コマンドを使用する場合の落とし穴を参照してください。
元のリンク: crond スクリプト実行における同時実行競合の問題を解決する 転載する場合は出典を明記してください。