3

cron を介して実行される php スクリプトを作成しています。そのタスクは、他の php スクリプトを呼び出すことです。呼び出されたスクリプトは、外部から実行することもできます。私が望むのは、1 つのファイルが実行されている間、同時に実行されるべきではないということです。物事を明確にするために、次のことを検討してください

1 つのスクリプト master.php が、他の 2 つのスクリプト script1.php と script2.php を次々と呼び出すとします。script1.php を呼び出すと、実行が開始され、処理が完了するまでに 10 分かかります。この Script1.php は、この 10 分間でユーザーが個別に実行することもできます。

私がやりたいのは、このスクリプトが処理中に、並列実行だけにならないようにすることです。

これを達成する方法はありますか?(おそらく、script1.php の PID を確認することによって)。

事前にサンクス。

4

5 に答える 5

4

これは、pidファイルで行う方法です。また、スクリプトが 300 秒以上実行されている場合、スクリプトは強制終了されます。

$pid_file = '/var/run/script1.pid';
if (file_exists($pid_file)) {
        $pid = file_get_contents($pid_file);
        if ($pid && file_exists('/proc/' . $pid)) {
                $time = filemtime($pid_file);
                if (time() - $time > 300) {
                        posix_kill($pid, 9);
                } else {
                    exit("Another instance of {$argv[0]} is running.\n");
                }
        }
}

$pid = posix_getpid();
if (!file_put_contents($pid_file, $pid)) exit("Can't write pid file $pid_file.\n");

そして、スクリプトの最後で pid ファイルのリンクを解除します。

unlink($pid_file);

最初のインスタンスが終了したときにスクリプトを実行する場合は、exit() を sleep(1) に置き換えて、ブロック全体をループに入れます。

于 2012-05-03T11:40:56.933 に答える
3

スクリプトの開始時に、ロック ファイルが存在するかどうかを確認します。そうでない場合は作成します。スクリプトの別のセッションの実行中に次にスクリプトが開始されると、ロック ファイルが存在するため、スクリプトは終了します。スクリプトの最後で、ロック ファイルを削除します。

于 2012-05-03T11:33:09.923 に答える
0

script1 の pid を一時ファイル、パイプ、共有メモリに保存するか、親スクリプトに直接保存できます。getmypid(); を使用して、php プロセスから pid を取得できます。

于 2012-05-03T11:33:19.013 に答える
0

スクリプトを開始したら、「Script1.txt」というテキストファイルを作成し、スクリプトの最後でファイルを削除するだけです。

実際のスクリプトを実行する前に (たとえば、Script1.php の最初の行で)、そのファイルの存在を確認してください。存在する場合は、スクリプトが既に実行されていることがわかります。

于 2012-05-03T11:34:56.300 に答える
-1

execは実行が完了するまで待機すると思います。したがって、master.php は次のようになります。

exec("/path/to/php script1.php");
exec("/path/to/php script2.php");

于 2012-05-03T11:37:11.600 に答える