這看起來很簡單,但我無法弄清楚。PHP在文本文件中增加一個計數變量
file_get_contents('count.txt');
$variable_from_file++;
file_put_contents('count.txt', $variable_from_file);
count.txt
中只有一行數據,它是命中計數器。有沒有辦法做到這一點?
這看起來很簡單,但我無法弄清楚。PHP在文本文件中增加一個計數變量
file_get_contents('count.txt');
$variable_from_file++;
file_put_contents('count.txt', $variable_from_file);
count.txt
中只有一行數據,它是命中計數器。有沒有辦法做到這一點?
$variable_from_file = (int)file_get_contents('count.txt');
但請注意,這不是線程安全的。
完全像你這樣做應該工作得很好。只需從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.');
}
這對我的作品雖然
$count = intval(file_get_contents('count.txt'));
file_put_contents('count.txt', ++$count);
echo file_get_contents('count.txt');
如果你想確保沒有增量走無數的(這是什麼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);
這將鎖定文件,防止任何人讀取或同時計數遞增寫它(指人將不得不等待,纔可以增加值)。
是的,它會計算所有請求,但它也會鎖定所有請求。這意味着這個代碼是一個瓶頸,不推薦。對每個請求進行計數並避免阻塞多個線程並不容易。 – mgutt
有一個稍微有趣的方法:
file_put_contents("count.txt",@file_get_contents("count.txt")+1);
你的意思是線程安全的,先生? – Norse
用最簡單的術語來說,當'file_get_contents()'正在讀取文件時,除非完全完成,否則沒有其他線程(程序)可以使用。 [閱讀更多關於安全線程的信息](http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx) 。 – Litty
這是100%線程安全的。除非'$ variable_from_file'是一個可以從多個線程修改的全局變量。給出當前代碼的不是。 – Cristik