PHP:为什么exec()没有返回输出?

78

我正在编写一个 PHP 脚本,用于使用 Linux shell 命令 ping 检查网络连接,并使用 PHP 的 exec() 调用它:

<?php


// Bad IP domain for testing.
$domain_bad = "lksjdflksjdf.com";

$ip_address = $domain_bad;

exec("ping -c 1 $domain_bad", $output, $return_var);

var_dump($return_var);
echo "return_var is: $return_var" . "\n";
var_dump($output);


exit;
?>

我没有得到从$output 中ping命令的错误消息输出,这正是我所期望的:

$ php try.php
ping: unknown host lksjdflksjdf.com
int(2)
return_var is: 2
array(0) {
}

如果域名是好的域名,比如yahoo.com,那么$output将有来自ping命令的输出数组。但是如果出现错误,例如'ping: unknown host lksjdflksjdf.com',它就不会返回到$output数组中。

为什么会发生这种情况,有没有更好的方法来解决这个问题?

2个回答

151

你应该将标准错误重定向到标准输出。

为了做到这一点,需要像这样更改你的exec()调用:

exec("ping -c 1 $domain_bad 2>&1", $output, $return_var);

更多关于2>&1含义的信息可以在这里找到。


8
在执行命令时,添加 "2>&1" 后输出仍为空数组。如果从命令行执行,则会输出2个值。 - D T

10
如果上面的答案无法解决您的问题,可能是由于exec()被禁用了。您可以尝试检查php.ini文件中的disable_functions行。

3
好提示。 应该是 disable_functions 而不是 disabled_functions - makozaki

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