2012-06-03 106 views
1

這看起來很簡單,但我無法弄清楚。PHP在文本文件中增加一個計數變量

file_get_contents('count.txt'); 
$variable_from_file++; 
file_put_contents('count.txt', $variable_from_file); 

count.txt中只有一行數據,它是命中計數器。有沒有辦法做到這一點?

回答

3
$variable_from_file = (int)file_get_contents('count.txt'); 

但請注意,這不是線程安全的。

+0

你的意思是線程安全的,先生? – Norse

+1

用最簡單的術語來說,當'file_get_contents()'正在讀取文件時,除非完全完成,否則沒有其他線程(程序)可以使用。 [閱讀更多關於安全線程的信息](http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx) 。 – Litty

+0

這是100%線程安全的。除非'$ variable_from_file'是一個可以從多個線程修改的全局變量。給出當前代碼的不是。 – Cristik

2

完全像你這樣做應該工作得很好。只需從file_get_contents()中獲取數據,並檢查這兩項功能是否成功。

$var = file_get_contents('count.txt'); 
if ($var === false) { 
    die('Some error message.'); 
} 
$var++; 
if (file_put_contents('count.txt', $var) === false) { 
    die('Some error message.'); 
} 
1

這對我的作品雖然

$count = intval(file_get_contents('count.txt')); 
file_put_contents('count.txt', ++$count); 
echo file_get_contents('count.txt'); 
8

如果你想確保沒有增量走無數的(這是什麼CodeCaster指的是,該腳本可以加載count.txt,增加它,而另一個文件是做同樣的,然後保存,然後只有一個增量已經完成,而不是正確的兩個),你應該使用fopen

$fp = fopen('count.txt', 'c+'); 
flock($fp, LOCK_EX); 

$count = (int)fread($fp, filesize('count.txt')); 
ftruncate($fp, 0); 
fseek($fp, 0); 
fwrite($fp, $count + 1); 

flock($fp, LOCK_UN); 
fclose($fp); 

這將鎖定文件,防止任何人讀取或同時計數遞增寫它(指人將不得不等待,纔可以增加值)。

+0

是的,它會計算所有請求,但它也會鎖定所有請求。這意味着這個代碼是一個瓶頸,不推薦。對每個請求進行計數並避免阻塞多個線程並不容易。 – mgutt

0

有一個稍微有趣的方法:

file_put_contents("count.txt",@file_get_contents("count.txt")+1);