在PHP中写入文本文件时是否截断整数?

dat*_*.io 2 php integer file

我写了一个下载计数器:

$hit_count = @file_get_contents('download.txt');
$hit_count++;
@file_put_contents('download.txt', $hit_count);

header('Location: file/xxx.zip');
Run Code Online (Sandbox Code Playgroud)

就如此容易.问题是统计数字被截断为4位数,因此没有显示实际计数:

http://www.converthub.com/batch-image-converter/download.txt

批量图像转换器程序每天下载几百次,PHP计数器已经存在数月.我第一次发现这个问题的时间大约是2个月之前,当我很高兴它在几周之后达到8000大关,而在此之后的一周,它再次达到了500.它一次又一次地发生.

不知道为什么.为什么?

Gor*_*onM 7

你可能在文件系统中遇到竞争条件,你正试图打开并读取一个文件,然后打开同一个文件并写入它.当您关闭文件以进行读取时,操作系统可能没有完全释放其对文件的原始锁定,然后将其打开以便立即再次写入.如果网站像您说的那样繁忙,那么您甚至可能会遇到多个脚本实例同时尝试访问该文件的问题

如果做不到这一点,一次完成所有文件操作.如果使用fopen(),flock(),fread(),rewind(),fwrite()和fclose()来处理命中计数器更新,则可以避免必须关闭文件并再次打开它.如果你使用r +模式,你将能够读取值,增加它,并一次性写回结果.

这些都不能完全保证您不会遇到并发访问问题.
我强烈建议您研究一种不同的方法来实现您的点击计数器,例如数据库驱动的计数器.