我正在通過將當前計數存儲在文件中來製作一個簡單的頁面加載計數器。這是我想做到這一點:在保持鎖定的情況下讀取和寫入文件
- 鎖定文件(羣)
- 讀取當前計數(FREAD)
- 加一(++)
- 寫入新的計數(FWRITE)
- 解鎖文件/關閉它(flock/fclose)
這可以在不失鎖的情況下完成嗎?
據我所知,該文件不能寫入而不失鎖。我想出來解決這個問題的唯一方法是用「r +」模式編寫一個字符,然後計算字符。
我正在通過將當前計數存儲在文件中來製作一個簡單的頁面加載計數器。這是我想做到這一點:在保持鎖定的情況下讀取和寫入文件
這可以在不失鎖的情況下完成嗎?
據我所知,該文件不能寫入而不失鎖。我想出來解決這個問題的唯一方法是用「r +」模式編寫一個字符,然後計算字符。
至於說,你可以用蜂擁而至。一個簡單的例子是:
//Open the File Stream
$handle = fopen("file.txt","r+");
//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
$count = fread($handle, filesize("file.txt")); //Get Current Hit Count
$count = $count + 1; //Increment Hit Count by 1
ftruncate($handle, 0); //Truncate the file to 0
rewind($handle); //Set write pointer to beginning of file
fwrite($handle, $count); //Write the new Hit Count
flock($handle, LOCK_UN); //Unlock File
} else {
echo "Could not Lock File!";
}
//Close Stream
fclose($handle);
謝謝,ftruncate就是我一直在尋找的東西! – Znarkus 2010-03-15 23:48:08
ftruncate沒有像預期的那樣工作,但'rewind'做了竅門 – Znarkus 2010-03-18 09:30:35
在我的情況下,我必須在'ftruncate($ handle,0)'之後使用'rewind($ handle)'' – bingjie2680 2013-01-30 15:06:17
我相信你可以使用flock
來達到這個目的。打開一個指向你文件的指針,flock
它,讀取數據,寫入數據,然後關閉(關閉自動解鎖)。
是的,你必須使用倒帶前ftruncate
。否則,文件的舊內容只填充零。
工作順序是:
fopen
flock LOCK_EX
fread filesize
rewind
ftruncate 0
fwrite
flock LOCK_UN
fclose
的1個字符/頁面加載可能實際上是相當有趣的:)看着那個文件增長... – Znarkus 2010-03-15 22:20:05