4

这似乎很简单,但我无法弄清楚。

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

里面只有一行数据,count.txt就是命中计数器。有没有办法做到这一点?

4

5 回答 5

13

如果您想确保没有不计数的增量(这就是 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);

这将锁定文件,防止任何其他人在计数增加时对其进行读取或写入(这意味着其他人必须等待才能增加值)。

于 2012-06-04T00:20:56.590 回答
5

有一个稍微好笑的方法:

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

file_get_contents读取计数器文件的内容。
@告诉 PHP 忽略丢失文件的错误。然后返回的 false 将被解释为 0 的计数。
+1 将导致字符串转换为数字。
file_put_contents然后将新值作为字符串存储在计数器文件中。

在非常繁忙的系统上,您可能希望首先获得文件锁以防止同时写入。操作系统文件缓存通常使这种方法非常快。

于 2016-01-05T22:57:49.023 回答
3
$variable_from_file = (int)file_get_contents('count.txt');

但请注意,这不是线程安全的。

于 2012-06-04T00:02:02.417 回答
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.');
}
于 2012-06-04T00:03:00.810 回答
1

虽然这对我有用

$count = intval(file_get_contents('count.txt'));
file_put_contents('count.txt', ++$count);
echo file_get_contents('count.txt');
于 2012-06-04T00:14:41.457 回答