Подавление вывода вызовов exec() в 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
Ответы
Ответ 1
Перенаправление stderr не должно влиять на обработку, просто не добавляйте &
. Он должен работать только в фоновом режиме, если вы перенаправляете вывод и запускаете его в фоновом режиме.
Изменить:
Прерванный открытый cygwin, вам нужно перенаправить 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';
Ответ 3
Перенаправление в /dev/null делает не, что PHP перестает ждать команды. Добавление &
делает это, вы, вероятно, свяжете эти два, потому что последний &
часто используется в сочетании с перенаправлением.
В ответ на комментарий Yannick (удаленный): кажется, что если вы хотите что-то запустить в фоновом режиме на PHP, вы должны перенаправить, а также использовать &
. Это не означает, что только перенаправление заставляет его работать в фоновом режиме.
Ответ 4
В соответствии с http://us3.php.net/manual/en/function.shell-exec.php вы можете назначить этот вывод команды переменной.
Вам необязательно что-либо делать с переменной, что означает, что вы эффективно подавляете вывод.
Надеюсь, что это поможет!