3

flock()関数を使用して、一時ファイルのロックを取得してスクリプトの別のインスタンスがすでに実行されているかどうかを確認しているので、次のインスタンスはファイルがロックされていないかどうかを確認する必要があります。

<?php    
$fp = fopen("/var/tmp/your.lock", "w");
if (!flock($fp, LOCK_EX|LOCK_NB)) { // try to get exclusive lock, non-blocking
    die("Another instance is running");
} 

//my script 
sleep(10);
echo 'completed successfully';

スクリプトは、同じブラウザから2つのインスタンスを同時に開いた場合に待機している間に、異なるブラウザから同時に2回ファイルを呼び出す場合に問題なく機能します。つまり、最初の呼び出しはロックを取得し、2番目の呼び出しはロックを待機して閉じません。

インスタンスがすでに機能しているファイルかどうかを確認する他の方法があるかもしれませんが、それらのほとんどは何かを実行してから元に戻します。私の使用例では、スクリプトは時間がかかるか、メモリ制限を超える可能性があるため、いつでも終了する可能性があります。なんらかの理由で

何か助けはありますか?

4

2 に答える 2

6

問題は:

ブラウザから同じURLで同じスクリプトを2回呼び出すと、同じプロセスを介してスレッド化され、flock()関数がプロセスレイヤーで非ブロッキングとして機能し、2番目のスクリプトが待機します。

たとえば、example.com / test.phpを2回呼び出すと、2つのリクエストが同じプロセスで機能しますが、確率変数を追加すると、次のような単一のリクエストごとに個別のプロセスが作成されます。

example.com/test.php?rand=1
example.com/test.php?rand=2

よく働く 。

于 2012-11-11T14:30:26.477 に答える
5

コマンドラインから同じスクリプトを2回実行します。私はそれがうまくいくと確信しています。

ブラウザは、特定のホストへの接続を一度に1つだけ許可することにより、サーバーへの接続をレート制限している可能性があります。異なるブラウザで異なる結果が得られるという事実は、ページを要求しているブラウザに関係なくPHPが同じように実行するため、PHPの問題ではないことを示します。

于 2012-11-11T14:06:19.893 に答える