使用文本文件作为访问者计数器/当不同的请求更新一个文件时会发生什么


using a text file for visitor counters / what happens when different requests updating one file ?

我在y网站上有一个使用db 的简单访问者计数器

请忽略语法错误

    $date = date('Y/m/d');
        $record = $this->db->query("select * from `page_view` where `date` = '$date' ");
        if (empty($record))
            $this->db->query(" insert into `page_view`(`date`,`view` ) value ('$date' ,'1') ");
        else {
            $sql = "UPDATE `page_view` SET `view` = `view`+1 WHERE  `date` = '{$date}'";
            $this->db->query($sql);
            }

我每天大约有50万访客,这有点高,我的mysql负载也是如此。我想知道我是否可以使用一个文本文件来存储每天的点击量,并在一天结束时将总访问次数从文本文件移动/存储到数据库。

至少在我识别并重写慢速查询之前。

$today = date('Y/m/d');
list ($counter , $date ) = explode('#' , file_get_contents('counter.txt'));
$counter++;
if( $today == $data )
file_put_contents('counter.txt' , $counter.'#'.$date );
else
file_put_contents('counter.txt' , '1#'.$today);

有什么理由不让我这么做吗?我会有什么问题吗?当几个访问者想要同时更新这个文件时会发生什么?

file_put_contents()的第三个参数"LOCK_EX"可以传递给"在进行写入时获取文件的独占锁"。不过,我同意@jszobody的观点,数据库将是最好的选择。

http://php.net/file_put_contents

int file_put_contents ( string $filename , mixed $data [, **int $flags = 0** [, resource $context ]] )
LOCK_EX  Acquire an exclusive lock on the file while proceeding to the writing.

我相信php一次只处理一个请求,所以更新文件应该不是问题,但为什么不使用分析或任何其他方法呢。为您节省了一些负载,并为您提供了大量信息