2

我编写了一个非常简单的页面计数器和一个记录脚本,该脚本递增存储在文件中的计数器并记录有关客户端操作系统和他们使用的浏览器的信息。这是我一直在从事的一个简单的业余时间项目,因此它非常初级,将计数器和记录的信息写入站点上每个页面的指定文件夹中,每天在一个新文件中。

问题是,我最近使用 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);
    }
4

1 回答 1

1

你应该FILE_APPEND在你的中使用标志,file_put_contents()否则你只会看到最后一个条目:

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

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

于 2013-01-04T17:50:15.383 回答