我设法使这个PHP计数器没有数据库,它是非常基本的,因为它增加.txt文件中的访问:
$counter_file = ("count.txt");
$fp = fopen($counter_file, "r");
$count = fread($fp, 1024);
fclose($fp);
$count = $count +1;
$fp = fopen($counter_file, "w");
fwrite($fp, $count);
fclose($fp);
但是当访问太快时,此计数器在远程服务器上失败。它回到0。 什么可以解释这种行为以及如何确保计数器永远不会回到0?
修改:此脚本更稳健。它使用flock
作为@ghopst建议。
$counter_file = ("count.txt");
$handle = fopen($counter_file,"r+");
//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
$count = fread($handle, filesize($counter_file));
$count = $count + 1;
ftruncate($handle, 0);
rewind($handle);
fwrite($handle, $count);
flock($handle, LOCK_UN);
} else {
echo "Could not Lock File!";
}
fclose($handle);
答案 0 :(得分:1)
它归结为文件系统,您的代码向每个访问者发出打开,读取,关闭,打开,写入和关闭文件的请求。如果正在写入文件,则它被锁定而不被另一个实例写入,这是文件系统的行为。也许最好有一个带有autoincrement列的简单数据库表,只需为每次访问插入一行然后删除它,然后你可以选择顶行来返回一个值。
答案 1 :(得分:-1)
试试这个版本:
<?php
$counter_file = ("count.txt");
$count = @file_get_contents($counter_file);
$count = $count ? intval($count) + 1 : 1;
file_put_contents($counter_file, $count);