当我使用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之前没有完全读入输入文件。
答案 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)
延迟。我不能等到启动级“拉面”:)