使用PHP制作一个点击计数器

时间:2014-04-19 23:20:17

标签: php mysql overwrite flock

使用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);

正如我刚才所说,该脚本可以正常运行,直到它同时运行两次。

我需要做些什么来计算每一次打击?

2 个答案:

答案 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***/