我已阅读 here并且无法真正理解如何加速我的简单 exec()
,它基本上如下所示:
zcat access_log.201312011745.gz | grep 'id=6' | grep 'id2=10' | head -n10
我已将 ini_set('memory_limit', 256);
添加到 PHP 文档的顶部,但该脚本仍需要大约 1 分钟才能运行(相比之下,Penguinet 中几乎立即完成)。我可以做些什么来改进它?
最佳答案
我会尝试以下一些方法:
更改您的执行程序以仅运行一些简单的内容,例如
echo Hello
看看是否仍然需要这么长时间 - 如果需要,则问题出在进程创建和 exec() 区域。
如果运行得很快,请尝试将 exec 更改为:
zcat access_log.201312011745.gz > /dev/null
看看是否是“zcat”拖慢了你的速度
考虑用“sed”替换 grep,一旦找到您要查找的内容,它就会退出(使用“q”),而不是一直持续到文件末尾 - 因为看起来(通过您的“头”)您只对字符串的前几个而不是所有出现的地方感兴趣。例如,您似乎正在查找包含“id=6”和“id2=10”的行,因此如果您使用如下所示的“sed”,它可能会更快,因为“sed”会打印它并在找到包含“id=6”后跟“id2=10”的行时立即停止
zcat access_log.201312011745.gz | sed -n '/id=2.*id2=10/p;q'
“-n”表示“一般情况下不打印”,然后它会查找“id=2”,后跟任何字符,然后“id2=10”。如果发现,它会打印该行,并且“q”使其立即退出,而不查看文件末尾。请注意,我假设“id=2”位于该行的“id2=10”之前。如果情况并非如此,“sed”将需要额外的工作。
关于PHP exec 处理简单的 3 管道 grep 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20379844/