Подавление вывода из вызовов exec () в PHP - PullRequest
21 голосов
/ 22 октября 2009

У меня есть ряд сценариев командной строки в 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

Ответы [ 4 ]

24 голосов
/ 22 октября 2009

Перенаправление stderr само по себе не должно влиять на то, где происходит обработка, просто убедитесь, что не добавлено &. Он должен работать только в фоновом режиме, если вы перенаправили вывод и заставили его работать в фоновом режиме.

Редактировать:

Взломан Cygwin, вам нужно перенаправить stderr для первой команды, попробуйте:

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo 2> /dev/null | mysql mysql';
exec($command, $output, $result);
8 голосов
/ 22 октября 2009

Просто перенаправить 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';
2 голосов
/ 22 октября 2009

При перенаправлении на / dev / null не PHP перестает ждать команды. Добавление & делает , и вы, вероятно, связываете эти два, потому что последний & часто используется вместе с перенаправлением.

В ответ на (удаленный) комментарий Янника: кажется, что если вы хотите запустить что-то в фоновом режиме в PHP, вы должны перенаправить, а также использовать &. Это не означает, что перенаправление само по себе заставляет его работать в фоновом режиме.

1 голос
/ 22 октября 2009

В соответствии с http://us3.php.net/manual/en/function.shell-exec.php вы можете назначить вывод этой команды переменной.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...