ホームページ >バックエンド開発 >PHPチュートリアル >crond スクリプト実行時の同時実行競合の問題を解決する

crond スクリプト実行時の同時実行競合の問題を解決する

WBOY
WBOYオリジナル
2016-06-23 09:09:351153ブラウズ

問題

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 に私を追加してください。

2 番目の方法は、Linux の flock コマンドを使用する方法です

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 スクリプト実行における同時実行競合の問題を解決する 転載する場合は出典を明記してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。