使用PHP或MySQL制作点击计数器的最佳方法是什么?
我使用PHP flock()
函数有几个文件覆盖问题,因为它不能正常工作。它尝试写同一个文件,在另一个进程的同一时间增加同一个变量,但变量值只增加一个而不是两个,导致计数命中丢失。我尝试使用MySQL数据库作为计数器,但它比上述方法错过了更多的命中。
以下是我尝试使用flock
函数的代码:
while(!$fp=fopen($filename,"a+"))
{
usleep(100000);
}
while(!flock($fp,LOCK_EX))
{
usleep(100000);
}
while(!include($filename))
{
usleep(100000);
}
ftruncate($fp,0);
rewind($fp);
$$varname=$newval;
//$text="text changes depending on the $type value";
fwrite($fp,$text);
flock($fp,LOCK_UN);
fclose($fp);
正如我刚才所说,该脚本可以正常运行,直到它同时运行两次。
我需要做些什么来计算每一次打击?
答案 0 :(得分:3)
如果您只需要数据库跟踪点击次数,那么您现在最好使用文件。您缺少的是在释放锁之前将文件刷新到磁盘。见http://nz.php.net/flock
while(!$fp=fopen($filename,"a+")) usleep(100000);
while(!flock($fp,LOCK_EX)) usleep(100000);
while(!include($filename)) usleep(100000);
ftruncate($fp,0);
rewind($fp);
$$varname=$newval;
//$text="text changes depending on the $type value";
fwrite($fp,$text);
fflush($fp);
flock($fp,LOCK_UN);
fclose($fp);
答案 1 :(得分:0)
/***Increment charge code***/
$fp = fopen('/var/www/html/live/vodcount.txt', 'c+');
flock($fp, LOCK_EX);
$count = (int)fread($fp, filesize('/var/www/html/live/vodcount.txt'));
ftruncate($fp, 0);
fseek($fp, 0);
fwrite($fp, $count + 1);
flock($fp, LOCK_UN);
fclose($fp);
$arr['charge_code'] = "aadata".$count;
/***Increment charge code***/