5

スクリプトの他のインスタンスがまだ実行されていない場合にのみ、実行したいphpスクリプトがあります。私はこのコードを持っています:

$lockfile = __DIR__.'/lock.file';

if(file_exists($lockfile) == false)
{
    echo 'no lockfile. Job will execute.';
    $handle = fopen($lockfile, 'x') or die('Cannot open file:  '.$lockfile);
    $data = 'This is the lockfile';
    fwrite($handle, $data);
    fclose($lockfile);

    createLinks();

    unlink($lockfile);
}
else
{
    echo 'Lockfile present, job will not execute. Please try again later';
}

ただし、ファイルが存在するかどうかは正しくチェックされません。ブラウザでスクリプトを呼び出すと、lock.file が正しく作成され (ftp で表示できます)、その後削除されます。ただし、スクリプトを同時に複数回実行することはできます。自分で ftp を使用して lock.file を作成すると、スクリプトが実行されません。私は何時間も探していましたが、それは何でしょうか? 多分私は愚かですが、これはうまくいくと思いますよね?

編集:ジェップ、群れがやった. どうもありがとう!最終的なコード:

$lockfile = __DIR__.'/lock.file';
$handle = fopen($lockfile, "x");

if(flock($handle, LOCK_EX))
{
    echo 'no lockfile. Job will execute.';

    $data = 'This is the lockfile';
    fwrite($handle, $data);

    createLinks();

    fclose($lockfile);  
    unlink($lockfile);
}
else
{
    echo 'Lockfile present, job will not execute. Please try again later';
}
4

3 に答える 3

4

のドキュメントからfile_exists:

注: この関数の結果はキャッシュされます。詳細については、clearstatcache() を参照してください。

と:

また、PHP は存在しないファイルに関する情報をキャッシュしないことに注意してください。そのため、存在しないファイルに対して file_exists() を呼び出すと、ファイルを作成するまで FALSE が返されます。ファイルを作成すると、後でファイルを削除しても TRUE が返されます。ただし、 unlink() はキャッシュを自動的にクリアします

関数を次のように変更してみてください。

if(file_exists($lockfile) == false)
{
    clearstatcache();
    ...

clearstatcache()を見てください。

于 2013-03-03T18:27:55.130 に答える
1

私は今日、あなたの問題とほぼ同じ問題に対処するために半日腰を下ろしました。私の PHP コードもファイル ロックを使用し、file_exists() を呼び出していました。そして、「奇妙な」 file_exists() 結果で同じ問題を抱えていました。ファイルの使用法 (ロックを取得するため) を DB の使用法に変更したとき、私は完全に混乱しました。ロックはテーブルの行に対応します。結果はまったく同じでした。ブラウザの異なるタブで同時にコードを起動しようとしましたが、それでもロックを取得できませんでした。

そして、そのような奇妙な行動の本当の理由が何であるかを理解しました. 私の場合(あなたのケースも同じようです)、主な問題は、スクリプトが「同時に複数回」起動されたが、1つのブラウザで起動されたという事実にありました。ただし、リクエストは同時にではなく順次処理されました。そのような効果の良い説明がここに与えられました: https://stackoverflow.com/a/3623584/1758680

したがって、すべてのリクエストが順次になると、各リクエストは前のリクエストが終了するのを待っていました。次のスクリプトが開始され、ロックを取得しようとする前に、各ロックが解放されました。

于 2013-08-05T17:14:43.463 に答える
-1

試す

$lockfile = 'lock.file';

または他の..

于 2013-03-03T18:28:43.030 に答える