首先让我们通过终端运行命令:
$ echo 1; /etc/init.d/apache3 restart; echo 2;
结果..(apache3故意查看错误)
1
bash: /etc/init.d/apache3: No such file or directory
2
要命。
现在让我们通过php运行它。
<?php
$command = "echo 1; /etc/init.d/apache3 restart; echo 2; 2>&1";
$response = shell_exec("$command");
echo $response;
?>
我在浏览器上看到的只有:1 2
我尝试过各种各样的事情。用&#34;&amp;&amp;&#34;替换了半冒号。 尝试了所有的PHP东西,如..
passthru()
exec()
system()
popen()
我几乎尝试过这一切。几个小时..不能让它向我展示我通过终端看到的相同内容。
答案 0 :(得分:1)
重启命令
后,您必须使用2&gt;&amp; 1你的命令:
$command = "echo 1; /etc/init.d/apache3 restart; echo 2; 2>&1";
你的结尾有“2&gt;&amp; 1”,没用。
如果其他人使用STDERR
,您还会在每个命令后添加2&gt;&amp; 1$command = "echo 1; /etc/init.d/apache3 restart 2>&1; echo 2 ";
答案 1 :(得分:1)
考虑使用exec。基函数仅返回输出的第一行:
$response = exec("$command"); // just the first line
但是使用附加参数来捕获输出(作为数组)和返回值
$retval = NULL;
$output = NULL;
$response = shell_exec("$command", $output, $retval); // last two params are passed by reference and modified by the command
另外,当user993553发布时,这些cli函数在PHP中捕获的输出通常只返回stdout而不是stderr。你可以附加&#34; 2 - ;&安培; 1&#34;对于任何给定的命令(注意2之前的空格),以便将stderr路由到输出中。
那就是说,你的功能变成了:
$command = "echo 1; /etc/init.d/apache3 restart 2>&1; echo 2;";
$retval = NULL;
$output = NULL;
$response = exec($command, $output, $retval);
var_dump($output);
和输出:
array(3) {
[0] =>
string(1) "1"
[1] =>
string(37) "sh: 1: /etc/init.d/apache3: not found"
[2] =>
string(1) "2"
}
编辑:您还可以检查$ retval是否存在错误情况。如果它不为空或为零,则表示错误。
答案 2 :(得分:0)
来自shell_exec手册:
另请注意,shell_exec()不会抓取STDERR,因此请使用&#34; 2&gt;&amp; 1&#34;至 将它重定向到STDOUT并捕获它。