php读取nginx日志ip去重统计访问记录数

最近为了统计nginx下访问日志中至少百万记录的ip访问频率,日志文件大概500m,200多万条访问记录,经过测试速度还可以,当日志文件上1G就开始明显慢了,统计6G多的日志文件1500万条访问记录,本地机器需要30秒。尝试采用fread分流读取处理后效率也是差不多,暂时没找到更好方法,有更好的麻烦留言交流,感谢。

代码如下:

ini_set('display_errors',1); //错误信息
ini_set('display_startup_errors',1); //php启动错误信息
error_reporting(E_ALL & ~E_NOTICE ); //打印出所有的 错误信息

$result = array();
$fp = fopen('upstream.log', 'r');
$num = 0; //行数
while(!feof($fp))
{
 $line = fgets($fp);//指针方式读取一行
 $line = trim($line);
 $line = trim($line, "\r");
 $line = trim($line, "\n");
 
 $ip = substr($line, 0, strpos($line, '- -')-1);//提取ip
 if($ip == ''){
  continue;
 }
 $result[$ip] = $result[$ip]+1;
 $num++;
}
fclose($fp);

echo $num;//总行数
arsort($result);//排序
echo '<pre>';
print_r(array_slice($result, 0, 30));//前30条
exit;
此条目发表在服务器分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复