2011-10-08 63 views
0

如果我創建一個計數器程序,基本上加載文本文件「counter.txt」,然後它讀取文件,如果它包含一個數字,它會將數字加1並更新文件數字並保存文件。寫入文件的PHP問題

上述程序的代碼可以正常工作,可以讓每秒執行1次執行,但是當執行時間非常高時(例如每秒100次),問題就會開始。

我面臨的問題是文件內容有時會被刪除,有時計數器計數不正確。因此可以說我每秒執行100次執行,但計數只會增加10.我確定所有執行都已完成,因爲每次執行後都會寫入一個文件,並且在另一個目錄中寫入了100個文件以用於執行次數,但計數僅增加10.

<?php 
$File = "counter.txt"; 
$handle = fopen($File, 'r+') ; 
$data = fread($handle, 512) ; 
$count = $data + 1; 
fseek($handle, 0) ; 
fwrite($handle, $count) ; 
fclose($handle) ; 
?> 
+0

您需要防止腳本的多個實例同時讀取/寫入文件。這可以通過鎖或文件鎖定來完成。見http://www.php.net/manual/en/function.flock.php – hakre

回答

1

問題是兩個文件同時計數。計數器不能正確設置。你需要確保;該文件一次只能訪問一次。

Process1: Reads File and gets 0 
Process1: Increments 0 to 1 
Process2:Reads File and gets 0 
Process1: Writes 1 to File 
Process2: Increments 0 to 1 
Process2: Write 1 to File 
0

嗨@MasterCassim是對的。

使用flockhttp://php.net/manual/en/function.flock.php)鎖定文件

<?php 
//some code here 
flock($file_handle, LOCK_EX) // <- Your code will pause here until you get the lock for indefinite amount of time or till your script times out 
//some code here 
?> 
+0

這也需要檢查,如果文件已經被鎖定,如果是,等待一段時間或返回FALSE。 –

+0

@ ott--你爲什麼需要支票?從PHPDoc檢查這一行 - 「默認情況下,此函數將阻塞,直到獲取請求的鎖定」 – Rifat

+0

對,我沒有意識到阻止該呼叫。 –

0

如果你碰巧已經使用DB與你的PHP頁面,你可以把櫃檯到它,那麼你將有一個單純的UPDATE語句與SET counter = counter + 1