1

PHPでファイルに書き込もうとしていますが、これは私が使用しているコードです(この回答から前の質問への引用):

$fp = fopen("counter.txt", "r+");

while(!flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    // waiting to lock the file
}

$counter = intval(fread($fp, filesize("counter.txt")));
$counter++;

ftruncate($fp, 0);      // truncate file
fwrite($fp, $counter);  // set your data
fflush($fp);            // flush output before releasing the lock
flock($fp, LOCK_UN);    // release the lock

fclose($fp);

読み取り部分は正常に機能します。ファイルが読み取られた場合、そのコンテンツは適切に読み取られます。つまり、ファイルに が含まれている場合22892289読み取られます。

問題は、値をインクリメントしてそのファイルに書き換えると、[NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL]1書き込まれることです。

私は何が欠けていますか?null 文字が書き込まれるのはなぜですか?

4

3 に答える 3

5

あなたが見逃しているのはrewind()です。それがないと、0 バイトに切り捨てた後、ポインターはまだ先頭にありません (参照)。したがって、新しい値を書き込むとNULL、ファイルにパディングされます。

このスクリプトは、ページが読み込まれるたびに、現在のカウントのファイルを読み取り (存在しない場合は作成します)、インクリメントし、同じファイルに書き戻します。

$filename = date('Y-m-d').".txt";

$fp = fopen($filename, "c+"); 
if (flock($fp, LOCK_EX)) {
    $number = intval(fread($fp, filesize($filename)));
    $number++;

    ftruncate($fp, 0);    // Clear the file
    rewind($fp);          // Move pointer to the beginning
    fwrite($fp, $number); // Write incremented number
    fflush($fp);          // Write any buffered output
    flock($fp, LOCK_UN);  // Unlock the file
}
fclose($fp);
于 2015-03-11T20:56:11.160 に答える
0

編集#2:

群れでこれを試してください(テスト済み)

ファイルがロックされていない場合、例外がスローされます (追加の行を参照) if(...

この受け入れられた回答から例外スニペットを借りました。

<?php

$filename = "numbers.txt";
$filename = fopen($filename, 'a') or die("can't open file");

if (!flock($filename, LOCK_EX)) {
    throw new Exception(sprintf('Unable to obtain lock on file: %s', $filename));
}

file_put_contents('numbers.txt', ((int)file_get_contents('numbers.txt'))+1);

// To show the contents of the file, you 
// include("numbers.txt");

    fflush($filename);            // flush output before releasing the lock
    flock($filename, LOCK_UN);    // release the lock


fclose($filename);
echo file_get_contents('numbers.txt');

?>
于 2013-08-15T15:28:49.780 に答える
-1

簡略化されたバージョンのこのコードを使用できますが、それが最適かどうかはわかりません。

<?php
$fr = fopen("count.txt", "r");
$text = fread($fr, filesize("count.txt"));
$fw = fopen("count.txt", "w");
$text++;
fwrite($fw, $text);
?>
于 2013-08-15T15:32:03.853 に答える