Подтвердить что ты не робот

Подавление вывода вызовов 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

4b9b3361

Ответ 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 вы можете назначить этот вывод команды переменной.

Вам необязательно что-либо делать с переменной, что означает, что вы эффективно подавляете вывод.

Надеюсь, что это поможет!