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

dauxcl2d  于 2023-11-16  发布在  PHP
关注(0)|答案(5)|浏览(130)

这看起来很简单,但我想不出来。

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

字符串
count.txt中只有一行数据,它是hits计数器。有没有办法做到这一点?

t1qtbnec

t1qtbnec1#

如果你想确保没有不计数的增量(这就是CodeCaster所指的,脚本可能会加载count.txt,增加它,而另一个文件也在做同样的事情,然后保存,然后只会做一个增量,而不是正确的两个),你应该使用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 );

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

z4bn682m

z4bn682m2#

有一个稍微有趣的方法:

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

字符串

file_get_contents读取计数器文件的内容。
**@**告诉PHP忽略文件丢失的错误。返回的false将被解释为计数0。

+1将导致字符串转换为数字。

file_put_contents然后将新值作为字符串存储在计数器文件中。

在一个非常忙碌的系统上,你可能想先获得一个文件锁,以防止同时写入。操作系统的文件缓存通常使这种方法非常快。

vsdwdz23

vsdwdz233#

$variable_from_file = (int)file_get_contents('count.txt');

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

uxh89sit

uxh89sit4#

就像你做的那样,它应该工作得很好。只要从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.');
}

字符串

x6492ojm

x6492ojm5#

这对我来说很有效

$count = intval(file_get_contents('count.txt'));
file_put_contents('count.txt', ++$count);
echo file_get_contents('count.txt');

字符串

相关问题