尝试更新内容时文件刷新

时间:2013-01-04 17:44:53

标签: php logging file-io

我编写了一个非常简单的页面计数器和一个日志记录脚本,它会增加存储在文件中的计数器,并记录有关客户端操作系统及其使用的浏览器的信息。这是我一直在做的一个简单的业余时间项目,因此它非常简陋,将计数器和记录的信息写入网站上每个页面的指定文件夹中,每天都在一个新文件中。

问题是,我最近使用blitz.io来测试我的网站,当我运行每秒250个请求的“Rush”时,计数器和日志被完全刷新,除了最后一个查询。

我并不完全确定发生了什么,但我怀疑PHP的某些内容没有正确完成之前的查询,然后才开始使用下一个查询。

我对它们使用file_get_contents()/ file_put_contents()而不是file()。更改为file()会解决问题吗?

这是柜台:

    $filename = '.' . $_SERVER['PHP_SELF'];
$counterpath = '/Websites/inc/logs/counters/total/' . getCurrentFileName() . '-counter.txt';
$globalcounter = '/Websites/inc/logs/counters/total/global-counter.txt';

if (file_exists($counterpath)) {
    $hit_count = file_get_contents($counterpath);
    $hit_count++;
    file_put_contents($counterpath,$hit_count);
}
else {
    $hit_count = "1";
    file_put_contents($counterpath, $hit_count);
}

这是记录器:

$logdatefolder = '/Websites/inc/logs/ip/' . date('Y-m-d',$_SERVER['REQUEST_TIME_FLOAT']);
    $logfile = $logdatefolder . "/" . getCurrentFileName() . '-iplog.html';
    $ua = getbrowser();
    if (false == (file_exists($logdatefolder))) {
        mkdir($logdatefolder);
    }
    function checkRef() {
        if (!isset($_SERVER['HTTP_REFERER'])) {
            //If not isset -> set with dummy value
            $_SERVER['HTTP_REFERER'] = 'N/A';
        } 
        return $_SERVER['HTTP_REFERER'];
    }

    /* Main logger */
    $logheader = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en-US\"><head><title>" . getCurrentFileName() . " log</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /></head><body>";
    $logentry = date("Y-m-d, H:i:s, O T") . ":" . 
    "<br />- Requesting: http://giphtbase.org" . $_SERVER['REQUEST_URI'] . 
    "<br />- Arriving from: " . checkRef() . 
    "<br />- Browser: " . $ua['browser'] . 
    "<br />- Full browser name: " . $ua['name'] . 
    "<br />- Operating system: " . $ua['platform'] . 
    "<br />- Full user agent: " . $ua['userAgent'] . 
    "<br />";
    $logfooter = "<!-- Bottom --></body></html>";

    if (file_exists($logfile)) {
        $logPage = file_get_contents($logfile);
        $logContents = str_replace("<!-- Bottom --></body></html>","",$logPage);
        file_put_contents($logfile, $logContents . $logentry . $logfooter);
    }
    elseif (false == (file_exists($logfile))) {
        file_put_contents($logfile, $logheader . $logentry . $logfooter);
    }

1 个答案:

答案 0 :(得分:1)

您应该在FILE_APPEND中使用file_put_contents()标记,否则您只能看到最后一个条目:

file_put_contents($logfile, $logContents . $logentry . $logfooter, FILE_APPEND);

对于计数器,看起来该文件试图被不同的线程写入太多次,导致它无法访问。您应该使用数据库,或创建file_lock,或创建临时文件并运行cronjob来进行数学运算。