php,exec,sort命令,输出文件'出现'截断,但输入文件未完全读取到EOF

时间:2017-01-28 19:25:20

标签: php sorting exec truncated

当我使用php

exec('sort /var/www/website/file_in.txt -o /var/www/website/file_out.txt');

从sort命令输出的文件是trunacted

输入文件大小= 2,442,541

输出filesize = 1,146,881

我还注意到,当使用php函数filesize(file_in.txt)时,返回值= 1,146,881,而不是终端会话中显示的正确大小。我在调用filesize()之前调用了clearstatcache()。

有趣的是,filesize报告file_in的大小与file_out被截断的值相同。

我正在运行Linux _x86_64 64位PHP版本,所以我认为这消除了文件gt 2MB的32位文件大小限制问题。

当我在终端会话中以用户www-data运行sort命令时,输出文件与输入文件的大小相同,没有截断。

我尝试编写一个shell脚本来从exec调用,希望它可以绕过可能的php缓冲区限制,但它有相同的截断输出文件。

我在一个单独的终端上运行TOP以观察CPU和MEMORY的使用情况,但由于在终端中运行时coammdn不会截断输出,这似乎是一个PHP问题。

是否有任何模糊的配置.ini设置我应该检查以解决此问题?

由于

附加信息:我意识到输出文件没有被截断,而是在EOF之前没有完全读入输入文件。

1 个答案:

答案 0 :(得分:1)

这似乎是由于php脚本执行的这一点缺乏可用内存引起的。

通过试验测试,我增加了SORT命令的选项--buffer-size = 4K,从4K,5K,10K,40K开始,但没有做到这一点。

我正在观看TOP以了解如何报告CPU%内存使用情况。

我不认为这是一个问题所以我没有在我原来的问题中描述它,但在通过EXEC调用SORT的这一步骤之前,我通过EXEC调用了pdftotext。在该进程运行时,服务器的CPU使用率飙升至98%。内存可能也飙升,但TOP的刷新率并没有捕获它。

我想我可以在调用SORT命令之前添加sleep(5)来暂停PHP脚本的执行,让CPU和内存峰值恢复正常一段时间。这解决了SORT读取整个输入文件并输出所有内容的问题。这也解决了错误的filesize()结果。

在生产环境中,我将启动具有更多容量的服务器,并尝试消除sleep(5)延迟。我不能等到启动级“拉面”:)