php exec输出被修剪

时间:2010-08-24 08:26:32

标签: php exec

我再次遇到在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

但是当通过

输出到网络时
<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
)

为什么即使我不想让它自动修剪掉我的输出?

4 个答案:

答案 0 :(得分: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 :(得分:1)

这是因为PHP无法分配足够大的缓冲区供您与exec一起使用。最好的办法是在两者之间添加一个步骤:将输出传输到exec()调用中的临时文件

示例:exec('ps -ef | grep java > /tmp/mytmpfilename.txt')

...然后通过调用file_get_contents()

将其转储到屏幕上

示例:var_dump(file_get_contents('/tmp/mytmpfilename.txt'));

编辑:或者,如果要输出很多数据,你可以使用file(),比如数千行。

答案 2 :(得分:1)

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

在TTY会话中,ps不会修剪输出,但在其他情况下(取决于TERM变量,它会。还可以通过添加-ww将其显式设置为无限制。 / p>

ps手册页对我来说是关键。

答案 3 :(得分:-1)

php没有修改你的输出,浏览器没有。通过右键单击检查原始输出 - &gt;在浏览器上查看页面源。