PHP使用flock()的计数器问题

标签 php counter flock

我的计数器有问题。我需要计算两个变量,用 | 分隔,但有时计数器不会增加变量的值。

numeri.txt(计数器):

5240|593389

这是 PHP 脚本:

$filename="numeri.txt";
$fp=fopen($filename,"r");
if(!flock($fp,LOCK_SH))
{
    while(true)
    {
        usleep(100000);
        if(flock($fp,LOCK_SH))
        {
            break;
        }
    }
}
$contents=fread($fp,filesize($filename));
flock($fp,LOCK_UN);
fclose($fp);
$fp=fopen($filename,'a');
if(!flock($fp,LOCK_EX))
{
    while(true)
    {
        usleep(100000);
        if(flock($fp,LOCK_EX))
        {
            break;
        }
    }
}
ftruncate($fp,0);
$contents=explode("|",$contents);
$clicks=$contents[0];
$impressions=$contents[1]+1;
fwrite($fp,$clicks."|".$impressions);
flock($fp,LOCK_UN);
fclose($fp);

我将计数器设置为正确的值,但 3-4 天后计数器尚未计算出大约 50 次展示(“|”后的数字)

如何修复代码?

最佳答案

两个问题:

1)仍然有机会进行读取,另一个进程写入文件,然后这个进程写入文件。需要毫秒级的计时,但这是可能的。

2)您实际上并没有验证“打开”是否有效 - 它可能会失败。

解决办法是首先检查是否打开失败并重试,其次做一锁-独占。转述代码:

while (!$fh = fopen($file, 'c+')) {   // Read write, do not truncate, place pointer at start.
    usleep(100000);
}
while (!flock(LOCK_EX)) {
    usleep(100000);
}
$content = fread();
// Process content...
ftruncate();
fseek(0);  // Or frewind();
fwrite();
fclose();  // Also releases the lock.

关于PHP使用flock()的计数器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16130363/

相关文章:

php - file() 在读取时是否锁定文件?

windows-services - 您如何获得 Windows 服务的当前故障计数

hadoop - 为什么 Hadoop map reduce 作业中允许的计数器数量有限制?

linux - 在 QNAP NAS 上安装 node.js 时显示 "flock: Command not found"

php - 删除数据库中的记录(mysql工作台)

php - 使用 Php 和 Salt&MD5 提交到 Mysql

php - 在 Codeigniter 上对多个用户使用 $this->db->insert_id()

php - 使用键模式从 Laravel 4 缓存中删除?

python - 计数器列表 python 2.7

c++ - 在 Linux (GCC 4.6) 上聚集 C++ ifstream