带flock的PHP计数器

带flock的PHP计数器,php,flock,Php,Flock,我的柜台有问题。我需要计算两个变量,用|分隔,但有时计数器不会增加变量的值 numeri.txt(计数器): 这是PHP脚本: $filename="numeri.txt"; while(!$fp=fopen($filename,'c+')) { usleep(100000); } while(!flock($fp,LOCK_EX)) { usleep(100000); } $contents=fread($fp,filesize($filename)); ftruncate($

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

numeri.txt(计数器):

这是PHP脚本:

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

我有另一个计数器,速度要慢得多,但精确计算两个值(点击和印象)。有时计数器
numeri.txt
比另一个计数器计数的印象更多。为什么?如何解决此问题?

在解锁前尝试执行刷新。您甚至在数据可能被写入之前就解锁了,从而允许另一次执行失败


尝试在解锁前执行刷新。您甚至在数据可能被写入之前就解锁了,从而允许另一次执行失败


我们在流量大的网站上使用以下内容来统计印象:

<?php

    $countfile = "counter.txt"; // SET THIS

    $yearmonthday = date("Y.m.d");
    $yearmonth = date("Y.m");;

    // Read the current counts
    $countFileHandler = fopen($countfile, "r+");
    if (!$countFileHandler) {
        die("Can't open count file");
    }

    if (flock($countFileHandler, LOCK_EX)) {
        while (($line = fgets($countFileHandler)) !== false) {
            list($date, $count) = explode(":", trim($line));
            $counts[$date] = $count;
        }

        $counts[$yearmonthday]++;
        $counts[$yearmonth]++;

        fseek($countFileHandler, 0);

        // Write the counts back to the file
        krsort($counts);
        foreach ($counts as $date => $count) {
            fwrite($countFileHandler, "$date:$count\n");
            fflush($countFileHandler);
        }

        flock($countFileHandler, LOCK_UN);
    } else {
        echo "Couldn't acquire file lock!";
    }

    fclose($countFileHandler);
}
?>

在我们的高流量网站上,我们使用以下方法来计算印象:

<?php

    $countfile = "counter.txt"; // SET THIS

    $yearmonthday = date("Y.m.d");
    $yearmonth = date("Y.m");;

    // Read the current counts
    $countFileHandler = fopen($countfile, "r+");
    if (!$countFileHandler) {
        die("Can't open count file");
    }

    if (flock($countFileHandler, LOCK_EX)) {
        while (($line = fgets($countFileHandler)) !== false) {
            list($date, $count) = explode(":", trim($line));
            $counts[$date] = $count;
        }

        $counts[$yearmonthday]++;
        $counts[$yearmonth]++;

        fseek($countFileHandler, 0);

        // Write the counts back to the file
        krsort($counts);
        foreach ($counts as $date => $count) {
            fwrite($countFileHandler, "$date:$count\n");
            fflush($countFileHandler);
        }

        flock($countFileHandler, LOCK_UN);
    } else {
        echo "Couldn't acquire file lock!";
    }

    fclose($countFileHandler);
}
?>

检查第二个while循环是否运行到max_执行超时,我认为sime是一种死锁/饥饿场景。当你说“有时”-你的意思是函数有时增加,有时不增加?或者,您的意思是某些行不会每次都受到影响?我的意思是,函数会增加,但超出了它应该如何增加的范围increase@mightyuhu我怎么能检查呢?不,他想增加第二个值检查第二个while循环是否进入max_执行超时,我认为这是一种死锁/饥饿的情况。当你说“有时”-你的意思是函数有时增加,有时不增加?或者,您的意思是某些行不会每次都受到影响?我的意思是,函数会增加,但超出了它应该如何增加的范围increase@mightyuhu我如何检查它?不,他想增加我添加的第二个值
fflush($fp)介于
fwrite
flock($fp,LOCK_UN)之间但它仍然不起作用。。。你说的“多算一个值”是什么意思?我加了
fflush($fp)介于
fwrite
flock($fp,LOCK_UN)之间但它仍然不起作用。。。它更重要你说的“更重要”是什么意思。
2015.10.02:40513
2015.10.01:48396
2015.10:88909