4

ファイル名とjsonオブジェクトを受け取ってテキストファイルに書き込む関数があります。

オブジェクトが更新され、ファイルの現在の内容を完全に置き換える必要があります。各サイト訪問者には、独自のファイルがあります。複数の急速な変更により、ファイルが によって切り捨てられfopen(file,w+)、ロックされているために書き込まれないという状況が生じます。最終結果は空のファイルです。

それはとても普通の活動なので、これを行うための標準的な簡単な方法があると確信しています。理想的には、私が探しているのは、fopenモードw+またはモードを切り替える方法でファイルを切り捨てる前に、ファイルにロックがあるかどうかを確認する方法です。

fopen()ファイルがロックされているかどうかを確認するために渡すファイル ハンドルを取得するために でファイルを切り詰める必要があるのは奇妙に思えますが、ファイルを切り詰めたflock()だけなので、何の意味があるのでしょうか。

これが私がこれまで持っている機能です:

function updateFile($filename, $jsonFileData) {
    $fp = fopen($filename,"w+");
    if (flock($fp, LOCK_EX)) {  
        fwrite($fp, $jsonFileData);
        flock($fp, LOCK_UN);
        fclose($fp);
        return true;
    } else {
        fclose($fp);
        return false;
    }
}
4

1 に答える 1

10

PHPマニュアルの例1は、わずかな変更を加えるだけで必要な処理を実行できます。"c"モードを使用して、書き込み用にファイルを開き、ファイルが存在しない場合は作成し、切り捨てないでください。

$fp = fopen("/tmp/lock.txt", "c");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

"c"モードの完全な説明:

書き込み用にファイルを開きます。ファイルが存在しない場合は作成されます。存在する場合は、('w'ではなく)切り捨てられることも、この関数の呼び出しが失敗することもありません('x'の場合のように)。ファイルポインタはファイルの先頭にあります。これは、ファイルを変更する前にアドバイザリロック(を参照)を取得する必要がある場合に役立ちます。これはflock()、「w」を使用すると、ロックが取得される前にファイルが切り捨てられる可能性があるためです(切り捨てが必要な場合は、ftruncate()を使用できます。ロックが要求されます)。

必要なようには見えませんが"c+"、読み取りと書き込みの両方を行う場合は、対応するモードもあります。

于 2012-10-23T21:03:01.677 に答える