PHP执行命令输出被截断

5

我在使用php中的exec()函数时遇到了问题,我的操作系统是SUSE Linux,使用的是PHP 5.1.2。

当我使用exec()函数时,输出结果似乎被截断了。

这是在Linux系统下发生的。

~ -> ps -ef | grep java
root      3548     1  0 Aug05 ?        00:00:01 /usr/java/jdk1.5.0_13//bin/java -server -Djava.awt.headless=true -Xms512m -Xmx512m -XX:NewSize=224m -XX:MaxNewSize=256m -XX:SurvivorRatio=8 -XX:+UseParallelGC -jar /jfe-server.jar start
psinl    14811     1  0 09:12 ?        00:00:01 /usr/java/jdk1.5.0_13//bin/java -server -Djava.awt.headless=true -Xms512m -Xmx512m -XX:NewSize=224m -XX:MaxNewSize=256m -XX:SurvivorRatio=8 -XX:+UseParallelGC -jar jfe-server.jar start
psinl    18164 18080  0 16:20 pts/1    00:00:00 grep java

但是当通过Web输出时

<div>Checking whether JFEServer has been started</div>
<div><pre><?php exec('ps -ef | grep java',$output,$result);
print_r($output); ?></pre>
</div>
</br>

我的网页输出

Checking whether JFEServer has been started

Array
(
    [0] => root      3548     1  0 Aug05 ?        00:00:01 /usr/java/jdk1.5.0_13//bin/java
    [1] => psinl    14811     1  0 09:13 ?        00:00:01 /usr/java/jdk1.5.0_13//bin/java
    [2] => psinl    18069 14271  0 16:20 ?        00:00:00 sh -c ps -ef | grep java
    [3] => psinl    18071 18069  0 16:20 ?        00:00:00 grep java
)

为什么PHP会自动截取我不想要的输出内容呢?请注意,不要删除HTML标签。
4个回答

2
这是因为PHP无法为您的exec分配足够大的缓冲区。你最好在中间添加一步:在exec()调用中将输出导向临时文件。例如:exec('ps -ef | grep java > /tmp/mytmpfilename.txt'),然后使用file_get_contents()调用将其转储到屏幕上。例如:var_dump(file_get_contents('/tmp/mytmpfilename.txt'));另外,如果要输出大量数据(如几千行),可以使用file()

我知道这有点老了,但现在面临这个问题。有没有办法增加缓冲区以避免发送到临时文件?我尝试增加php.ini中的output_buffer,但没有帮助。 - Dario Zadro

1
您可以使用passthru,将命令的输出直接传递给客户端浏览器。
<div>Checking whether JFEServer has been started</div>
<div><pre><?php passthru( 'ps -ef | grep java', $result ); ?></pre></div>
<br />

如果这不能帮助你,你应该查看 ps 的文档,了解它是否测试标准输出终端类型(例如文件/管道/终端)。如果是这样,它可能会将其修剪为一些默认宽度,如果它无法确定实际终端宽度。在我的基于 Debian 的服务器上确实如此。我机器上的正确命令是:
<div>Checking whether JFEServer has been started</div>
<div><pre><?php passthru( 'ps -efww | grep java', $result ); ?></pre></div>
<br />

1

我在Centos 6.2上使用ps命令时,必须添加-w标志才能使输出翻倍。当然,这只有在特定情况下,特别是从脚本运行的会话中才需要。

在TTY会话中,ps不会裁剪输出,但在其他情况下(取决于TERM变量),它会进行裁剪。您还可以通过添加-ww来明确地将其设置为无限制。

ps手册对我非常有帮助。


-2

PHP 没有对您的输出进行修剪,是浏览器完成了这个过程。请通过右键单击 -> 在浏览器上查看页面源代码来检查原始输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接