这看起来很简单,但我想不出来。
file_get_contents('count.txt'); $variable_from_file++; file_put_contents('count.txt', $variable_from_file);
字符串count.txt中只有一行数据,它是hits计数器。有没有办法做到这一点?
count.txt
t1qtbnec1#
如果你想确保没有不计数的增量(这就是CodeCaster所指的,脚本可能会加载count.txt,增加它,而另一个文件也在做同样的事情,然后保存,然后只会做一个增量,而不是正确的两个),你应该使用fopen。
fopen
$filename = "count.txt"; $count = 0; $fp = fopen( $filename, 'c+' ); flock( $fp, LOCK_EX ); $size = filesize( $filename ); if( $size > 0 ) { // Coerce to largest natural data type. $count = fread( $fp, $size ) + 0; ftruncate( $fp, 0 ); fseek( $fp, 0 ); } fwrite( $fp, $count + 1 ); flock( $fp, LOCK_UN ); fclose( $fp );
字符串这将锁定文件,防止任何其他人在计数递增时对其进行阅读或写入(这意味着其他人必须等待才能递增值)。
z4bn682m2#
有一个稍微有趣的方法:
file_put_contents("count.txt",@file_get_contents("count.txt")+1);
字符串
file_get_contents读取计数器文件的内容。**@**告诉PHP忽略文件丢失的错误。返回的false将被解释为计数0。
+1将导致字符串转换为数字。
file_put_contents然后将新值作为字符串存储在计数器文件中。
在一个非常忙碌的系统上,你可能想先获得一个文件锁,以防止同时写入。操作系统的文件缓存通常使这种方法非常快。
vsdwdz233#
$variable_from_file = (int)file_get_contents('count.txt');
字符串但请注意,这不是线程安全的。
uxh89sit4#
就像你做的那样,它应该工作得很好。只要从file_get_contents()捕获数据,然后检查这两个函数是否成功。
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.'); }
x6492ojm5#
这对我来说很有效
$count = intval(file_get_contents('count.txt')); file_put_contents('count.txt', ++$count); echo file_get_contents('count.txt');
5条答案
按热度按时间t1qtbnec1#
如果你想确保没有不计数的增量(这就是CodeCaster所指的,脚本可能会加载
count.txt
,增加它,而另一个文件也在做同样的事情,然后保存,然后只会做一个增量,而不是正确的两个),你应该使用fopen
。字符串
这将锁定文件,防止任何其他人在计数递增时对其进行阅读或写入(这意味着其他人必须等待才能递增值)。
z4bn682m2#
有一个稍微有趣的方法:
字符串
file_get_contents读取计数器文件的内容。
**@**告诉PHP忽略文件丢失的错误。返回的false将被解释为计数0。
+1将导致字符串转换为数字。
file_put_contents然后将新值作为字符串存储在计数器文件中。
在一个非常忙碌的系统上,你可能想先获得一个文件锁,以防止同时写入。操作系统的文件缓存通常使这种方法非常快。
vsdwdz233#
字符串
但请注意,这不是线程安全的。
uxh89sit4#
就像你做的那样,它应该工作得很好。只要从
file_get_contents()
捕获数据,然后检查这两个函数是否成功。字符串
x6492ojm5#
这对我来说很有效
字符串