禁止 PHP 中 exec() 调用的输出

php
2022-08-30 16:07:07

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

 $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 继续处理而不等待命令完成。

提前致谢,
~詹姆斯·阿姆斯


答案 1

重定向 stderr 本身不应影响处理发生的位置,只需确保不要添加 .仅当您重定向输出并使其在后台运行时,它才应在后台运行。&

编辑:

破解了打开的天鹅座,你需要重定向stderr的第一个命令,试试这个:

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

答案 2

只需重定向到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';

推荐