5

2つのスクリプトが同時に実行されないようにするためのロックスクリプトが必要だとします。

if(file_get_contents('test.txt')) { // this is always empty...
   die("Another script is running in background!");
}
file_put_contents('test.txt', 'busy!');
sleep(10); // heavy work here
file_put_contents('test.txt', '');

それでも、2つのスクリプトを同時に実行できます。file_get_contents()結果がキャッシュされているように見えますか?

それを修正する方法は?DBではなくファイルを使いたい。


編集:私はすでにflock()を使用してロックスクリプトを実行することができました(Levi Morrisonに感謝します)

file_get_contentsとにかく、なぜこんなに予期しない振る舞いで動作するのか、私はまだ興味がありますか?

4

1 に答える 1

2

私はそれを再現して問題を理解することができました。最初はあなたが説明したように見えました.ブラウザでスクリプトをリクエストし、実行中にファイルの内容を確認しましたbusy!. 次に、2 番目のスクリプトを実行すると、最初のスクリプトと同じようにブラウザでも読み込まれました。それも動いていると思ったのですが、そうではありませんでした。

busy!次のようなランダムなものを追加する代わりに、それを理解するのは非常に簡単です。

file_put_contents('test.txt', 'busy washing ' . (mt_rand(1, 999) * 99999) . ' dishes');

同じ 2 つのスクリプトを同じ方法で実行し、ファイルの内容を監視します。最初は最初に書いたスクリプトになります。と言うbusy washing 1 dishes。次に、コンテンツが 2 番目のスクリプトが書き込む内容に変更され、番号が異なることがわかります。

基本的に、最初のスクリプトが終了するまで 2 番目のスクリプトが待機し、それから開始します。おもしろいことに、最初のスクリプトがファイルをクリアすると、2 番目のスクリプトが正常に実行されますが、ブラウザでは両方が同時に動作しているように見えます。実際、2 番目のスクリプトは、最初のスクリプトの 2 倍の時間実行されます。

AJAX を介して大量の非同期リクエストを実行し、別のブラウザー タブで同じ Web サイト ページをリクエストするときに、その動作に遭遇しました。スクリプトが終了するまで、タブを読み込めませんでした。

要するに、問題はありません!そのスクリプトを cron 経由でキューに入れると、それらは別々に実行され、2 番目のスクリプトはファイルが空でないことを検出して終了します。

于 2012-12-19T19:23:18.400 に答える