PHP从文件中读取最后几行的最佳方法是什么?
在我的PHP应用程序中,我需要 (主要是日志)
。有时我只需要最后一个,有时我需要数十或数百。基本上,我想像Unix tail
命令一样灵活。
这里有一些关于如何从文件中获取最后一行的问题(但是我需要 N 行),并给出了不同的解决方案。我不确定哪一个最好,哪个表现更好。
回答:
回答:
在互联网上搜索时,我遇到了不同的解决方案。我可以将它们分为三种方法:
- 天真 的使用
file()
PHP函数的人; - 作弊 者
tail
在系统上运行命令; - 强大 的使用
fseek()
。
我最终选择了(或写出了)五个解决方案,一个 幼稚的 解决方案,一个 作弊的 解决方案和三个 强大 的解决方案。
- 最简洁的 ,使用内置数组函数。
- command的[ 有一个大问题:如果
tail
不可用,它将无法运行,即在非Unix(Windows)或不允许系统功能的受限环境中运行。 - 从文件末尾读取 以查找(并计数)换行符的解决方案 。
- 针对大文件进行了优化的 解决方案。
- 略微 其中缓冲区长度是动态的,取决于要检索的行数。
所有解决方案均
。从某种意义上说,它们可以从任何文件返回任意数目的预期结果(解决方案#1除外,在大型文件的情况下,这可能会破坏PHP内存限制,不返回任何内容)。但是哪个更好?
回答:
为了回答这个问题,我进行了测试。这些就是这样完成的,不是吗?
我准备了一个样本 ,将/var/log
目录中的不同文件结合在一起。然后,我编写了一个PHP脚本,该脚本使用这五个解决方案中的每一个从文件末尾检索
1、2,..,10、20,… 100、200,…,1000 行。每个测试重复十次(大约 5×28×10 = 1400次
测试),以毫秒为单位测量 。
我使用PHP命令行解释器在本地开发计算机(Xubuntu 12.04,PHP 5.3.10、2.70 GHz双核CPU,2 GB
RAM)上运行脚本。
解决方案#1和#2似乎更糟。仅当我们需要阅读几行时,解决方案3才是好的。
注意动态缓冲区的大小如何优化算法:由于减少了缓冲区,执行时间在几行中要短一些。
让我们尝试更大的文件。如果我们必须读取 日志文件怎么办?
现在,解决方案#1到目前为止是最糟糕的:实际上,将整个10
MB文件加载到内存中并不是一个好主意。我也在1MB和100MB文件上运行测试,实际上是相同的情况。
解决方案#1是现在最好的解决方案!对于PHP而言,将10 KB的内存加载到内存中并不是什么大问题。#4和#5的表现也不错。但这是一个极端的情况:10
KB日志意味着大约150/200行…
您可以 在此处下载我的所有测试文件,源和结果
。
回答:
强烈建议在一般用例中使用
:适用于每种文件大小,并且在读取几行内容时表现特别好。
如果您应该读取大于10 KB的文件,请避免使用
。
解决方案 和
并不是我进行的每个测试的最佳选择:#2永远不会在2毫秒内运行,并且#3受到您要求的行数的严重影响(仅对1或2行有效)。
以上是 PHP从文件中读取最后几行的最佳方法是什么? 的全部内容, 来源链接: utcz.com/qa/425175.html