PHP增加文本文件中的计数变量

Nor*_*rse 4 php

这看起来很简单,但我无法弄清楚.

file_get_contents('count.txt');
$variable_from_file++;
file_put_contents('count.txt', $variable_from_file);
Run Code Online (Sandbox Code Playgroud)

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

小智 11

如果你想确保没有增量不计数(这是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);
Run Code Online (Sandbox Code Playgroud)

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


Sim*_*gét 5

有一个稍微有趣的方法:

file_put_contents("count.txt",@file_get_contents("count.txt")+1);
Run Code Online (Sandbox Code Playgroud)

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

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


Cod*_*ter 3

$variable_from_file = (int)file_get_contents('count.txt');
Run Code Online (Sandbox Code Playgroud)

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

  • 这是 100% 线程安全的。除非“$variable_from_file”是可从多个线程修改的全局变量。给出的当前代码不是。 (2认同)