我编写了一个非常简单的页面计数器和一个日志记录脚本,它会增加存储在文件中的计数器,并记录有关客户端操作系统及其使用的浏览器的信息。这是我一直在做的一个简单的业余时间项目,因此它非常简陋,将计数器和记录的信息写入网站上每个页面的指定文件夹中,每天都在一个新文件中。
问题是,我最近使用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);
}
答案 0 :(得分:1)
您应该在FILE_APPEND
中使用file_put_contents()
标记,否则您只能看到最后一个条目:
file_put_contents($logfile, $logContents . $logentry . $logfooter, FILE_APPEND);
对于计数器,看起来该文件试图被不同的线程写入太多次,导致它无法访问。您应该使用数据库,或创建file_lock,或创建临时文件并运行cronjob来进行数学运算。