php、执行、排序命令、输出文件 'appears' 被截断,但输入文件未完全读取到 EOF

php, exec, sort command, output file 'appears' truncated, but input file is not fully read up to EOF

当我使用 php 到

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

sort 命令输出的文件是 t运行acted

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

输出文件大小= 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 运行 排序命令时,输出文件与输入文件大小相同,没有 t运行cation。


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


我在一个单独的终端中有 TOP 运行ning 来观察 CPU 和 MEMORY 的使用情况,但是由于 运行 在终端中的 coammdn 没有 t运行对输出进行分类,这似乎是一个 PHP 问题。


是否有任何我应该检查的晦涩的配置 .ini 设置来解决这个问题?

谢谢


附加信息:我意识到输出文件没有被处理运行,而是直到 EOF 才完全读入输入文件。

这似乎是由于 php 脚本执行时可用内存不足造成的。

通过试用,我增加了 SORT 命令的选项 --buffer-size=4K 从 4K、5K、10K、40K 开始,但没有任何效果。

我正在观看 TOP 以查看 CPU % 内存使用率是如何报告的。

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

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

在生产环境中,我会spin-up一台容量更大的服务器,尽量消除sleep(5)延迟。我等不及要达到启动级别 "ramen noodles" :)