我再次遇到在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
)
为什么即使我不想让它自动修剪掉我的输出?
答案 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;在浏览器上查看页面源。