【发布时间】:2010-12-09 01:56:57
【问题描述】:
我在 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 在不等待命令完成的情况下继续处理。
提前致谢,
〜詹姆斯阿姆斯
【问题讨论】:
-
对于那些想知道为什么示例代码不起作用的人,这是因为只捕获了
stdout。给出的错误正在写入stderr,它不会被捕获而是转储到屏幕上。 -
我通过 google 来到这个线程,寻找一种在运行 PHP CLI 脚本时抑制所有输出的方法。我的解决方案是将
exec()调用包装在ob_start()和ob_end_clean()中。
标签: php