2010-03-15 81 views
8

我正在通過將當前計數存儲在文件中來製作一個簡單的頁面加載計數器。這是我想做到這一點:在保持鎖定的情況下讀取和寫入文件

  1. 鎖定文件(羣)
  2. 讀取當前計數(FREAD)
  3. 加一(++)
  4. 寫入新的計數(FWRITE)
  5. 解鎖文件/關閉它(flock/fclose)

這可以在不失鎖的情況下完成嗎?

據我所知,該文件不能寫入而不失鎖。我想出來解決這個問題的唯一方法是用「r +」模式編寫一個字符,然後計算字符。

+0

的1個字符/頁面加載可能實際上是相當有趣的:)看着那個文件增長... – Znarkus 2010-03-15 22:20:05

回答

19

至於說,你可以用蜂擁而至。一個簡單的例子是:

//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); 
+1

謝謝,ftruncate就是我一直在尋找的東西! – Znarkus 2010-03-15 23:48:08

+1

ftruncate沒有像預期的那樣工作,但'rewind'做了竅門 – Znarkus 2010-03-18 09:30:35

+3

在我的情況下,我必須在'ftruncate($ handle,0)'之後使用'rewind($ handle)'' – bingjie2680 2013-01-30 15:06:17

3

我相信你可以使用flock來達到這個目的。打開一個指向你文件的指針,flock它,讀取數據,寫入數據,然後關閉(關閉自動解鎖)。

http://php.net/flock

+0

是的,我知道的羊羣,但不知道如何保持鎖定時我寫。 – Znarkus 2010-03-15 22:42:47

+0

鎖定一直保持到您解鎖,關閉文件或腳本終止。 – 2010-03-15 23:04:00

+1

不會自動解鎖,因爲5.3.2 – Tertium 2015-05-15 08:14:52

1

是的,你必須使用倒帶前ftruncate。否則,文件的舊內容只填充零。

工作順序是:

fopen 
    flock LOCK_EX 
    fread filesize 
    rewind 
    ftruncate 0 
    fwrite 
    flock LOCK_UN 
    fclose 
相關問題