【发布时间】: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