首页 > 解决方案 > 使用 php 和 preg_match_all 分析大文本文件

问题描述

我们有一个大型日志文件,用于捕获数据管理系统的 api 请求和响应。我们正在尝试使用以下方法来识别和计算正在使用的 api.methods:

$filename = (external file name on log server >1Gb)

$filecontents = file_get_contents($filename);

preg_match_all("/=> api.(.*)/", $filecontents, $apimethods);

$countmethods=array_count_values($apimethods[1]);

$countmethods 为我们提供了可以显示在页面上的数组。

我们知道这种方法并不理想,但正在努力寻找更好的方法来做到这一点。

这是在内部服务器上,因此我们增加了内存限制 - 但我们知道这不是很有效。

ini_set ('memory_limit', filesize ($a) + 10000000000);

标签: phppreg-matchfile-get-contents

解决方案


file_get_contents()一次将整个文件读入内存,这是几乎所有使用量的来源。为了提高效率,您可以fgets()在循环中使用,一次读取一行,然后使用preg_match()而不是preg_match_all(). 这可能会更慢,但相比之下几乎不使用内存。

但是,这些方法都不会像简单地使用命令行grep那样快速或高效。您可以运行 cron 来 grep 日志并将匹配项转储到文件中,然后使用 PHP 读取/解析该文件以供显示。


推荐阅读