【问题标题】:Analyse large text file using php and preg_match_all使用 php 和 preg_match_all 分析大文本文件
【发布时间】:2019-01-16 15:10:18
【问题描述】:

我们有一个大型日志文件,用于捕获数据管理系统的 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);

【问题讨论】:

  • 实现某种形式的日志轮换,而不是向一个庞大的文件添加越来越多的数据......?
  • 你的意思是在api之后转义点吗?用 /=> api\.\K.*/ 将匹配的输出数组减半怎么样?然后只需在比赛中访问[0]。 (这不是一个可行的解决方案,只是一个想法,这就是我没有发布答案的原因。)
  • 为什么不将所有数据导入数据库?
  • 日志数据是 json 格式,但由于日志的工作方式,它的格式无法转换 - 示例如下:[16-01-2019 04:27:48]: Array ( [0] => api.search_results [1] => Array

标签: php preg-match file-get-contents


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2017-10-07
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多