【问题标题】:php, exec, sort command, output file 'appears' truncated, but input file is not fully read up to EOFphp,exec,sort 命令,输出文件“出现”被截断,但输入文件未完全读取到 EOF
【发布时间】:2017-01-28 19:25:20
【问题描述】:

当我使用php来

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

排序命令输出的文件被截断

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


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


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


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

谢谢


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

【问题讨论】:

  • 可能是这个帮助:computerhope.com/unix/usort.htm,找到句子“SIZE 后面可能跟以下乘法后缀”
  • 感谢您的建议,但该网页甚至没有列出与 SIZE 相关的选项 -S(缓冲区大小)。但是,在调查您的建议时,我发现了这个网页:gnu.org/software/coreutils/manual/html_node/…,它更好地描述了缓冲区大小,因此您的努力很有帮助。接下来我将尝试缓冲区大小测试。我还了解到有一个 --debug 选项,它可能有助于理解截断。
  • N.B> --debug 不能同时使用 -o 输出文件。调试使用stndout(即终端会话屏幕)
  • 也许你可以使用终端屏幕调试来解决问题,因为我认为问题与内存有关,它也会在终端模式下引起。
  • 我确实在终端模式下进行了排序,并且没有错误。我在终端中进行了调试,没有报告任何重大问题。但我现在有了解决方案

标签: php sorting exec truncated


【解决方案1】:

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

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

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

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

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

在生产环境中,我将启动一个容量更大的服务器,并尝试消除sleep(5) 延迟。我迫不及待地要达到启动级别的“拉面”:)

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多