首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用flock()的PHP计数器问题

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

Stack Overflow用户
提问于 2013-04-21 18:49:53
回答 1查看 307关注 0票数 1

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

numeri.txt (计数器):

5240|593389

这是PHP脚本:

代码语言:javascript
复制
$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次印象(“|”之后的数字)

如何修复代码?

EN

回答 1

Stack Overflow用户

发布于 2013-04-21 19:08:25

两个问题:

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

2)你实际上并没有验证“开放”的工作--它可能会失败。

解决方案是首先检查打开失败并重试,然后执行一次锁独占。改述的代码:

代码语言:javascript
复制
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.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16130363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档