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

Jam*_*mes 21 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);
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我希望命令的所有输出都写入$ 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.
...
Run Code Online (Sandbox Code Playgroud)

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

在此先感谢
~JamesArmes

Yan*_*ton 24

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

编辑:

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

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


jit*_*ter 8

只需重定向stderr/dev/null

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>/dev/null';
Run Code Online (Sandbox Code Playgroud)

或者 stdout

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>&1';
Run Code Online (Sandbox Code Playgroud)