0

毎分実行される cron ジョブがあり、最初の反復が 62 秒間実行される場合、2 回目の反復は最初の発生が終了するまで開始を待機しますか、それとも同じ cron ジョブが同時に実行される可能性がありますか?

これを説明するには、シナリオ 1 を参照してください。

|0    |60   |120  |180  |240  |300
------ Cron Job 1 Taking 60 Seconds
      --------- Cron Job 2 Taking 90 Seconds
            ------ Cron Job 3 Taking 90 Seconds but overlapping with the previous cron job

上記のことが起こるか、またはシナリオ 2 が起こるか:

|0    |60   |120  |180  |240  |300
------ Cron Job 1 Taking 60 Seconds
      --------- Cron Job 2 Taking 90 Seconds
               XXX-------Cron Job 3 waiting til the next 1 minute interval starts

私の懸念は、実行中の cron ジョブがない XXX とマークされた 30 秒間の期間があることです。

私は何を達成しようとしていますか?PHPスクリプトを毎秒無期限に実行したい。1 秒に 1 回実行する必要はありませんが、RUN、END、RUN、END、RUN、END の順に実行する必要があります。反復に 5 秒かかる場合、最初の反復が終了してから次の反復を開始する必要があります。しかし、それは決して止めてはなりません。問題は、反復の長さを判断できないことです。1 回の反復に 1 秒かかることもあれば、5 秒、またはそれ以上かかることもあります。

  1. cronはこれを行うことができますか?スクリプトが毎秒実行されることを保証できるようにするにはどうすればよいですか?
  2. そうでない場合、PHP スクリプトが無期限に実行され、反復が繰り返されることをどのように保証できますか?
4

6 に答える 6

2

次のように簡単なロック機構を実装できます。

if(!locked()) {
    lock();
    // your code here
    unlock();
} else {
    echo "script already running";
}

function lock()   { file_put_contents("write.lock", 'running'); }
function locked() { return file_exists("write.lock"); }
function unlock() { return unlink("write.lock"); }
于 2013-04-18T15:42:14.767 に答える
0

cron を使用する代わりに、スクリプトを「デーモン化」することを検討してください: PEAR System Daemon

そこから、単純なジョブ/タスク/ワーカー キューを作成し、それに応じてデーモンをディスパッチしてロックする必要があるようです。

于 2013-06-24T22:19:11.760 に答える