在PHP中抑制exec()调用的输出

时间:2009-10-22 12:40:29

标签: php

我在PHP中有许多命令行脚本,使用exec()来执行重启服务,加载MySQL时区文件等任务。虽然exec()本身不会向屏幕输出任何内容,但有些我正在运行的命令强制输出我似乎无法抑制(即使使用ob_start()/ ob_end_clean())。例如,以下内容会将时区文件加载到MySQL中。我们定期运行以确保MySQL的时区数据是最新的:

 $command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql';
 exec($command, $output, $result);

在这个例子中,我希望命令的所有输出都写入$ output,但我仍然将以下输出强制到屏幕:

Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh87' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh88' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh89' as time zone. Skipping it.
...

有没有办法抑制此输出?重定向到/ dev / null并不理想,因为这会导致PHP继续处理而不等待命令完成。

提前致谢,
~JamesArmes

4 个答案:

答案 0 :(得分:24)

单独重定向stderr不应影响处理的位置,只需确保不添加&。如果您重定向输出并使其在后台运行,它应该只在后台运行。

编辑:

破解开放的cygwin,你需要为第一个命令重定向stderr,试一试:

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo 2> /dev/null | mysql mysql';
exec($command, $output, $result);

答案 1 :(得分:8)

只需将stderr重定向到/dev/null

即可
$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>/dev/null';

stdout

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>&1';

答案 2 :(得分:2)

重定向到/ dev / null 会导致PHP停止等待命令。添加& 执行此操作,您可能会将这两者关联起来,因为最终的&通常与重定向一起使用。

回应Yannick的(已删除)评论:似乎您想在PHP中在后台运行某些内容,必须重定向以及使用&这并不意味着仅重定向会导致它在后台运行。

答案 3 :(得分:1)

根据http://us3.php.net/manual/en/function.shell-exec.php,您可以将此命令的输出分配给变量。

您不一定要对变量执行任何操作,这意味着您有效地抑制了输出。

希望有所帮助!