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

Solutions Collecting From Web of "Подавление вывода вызовов exec () в PHP"

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

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

Cracked open cygwin, вам нужно перенаправить stderr для первой команды, попробуйте:

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

Просто перенаправить 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'; 

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

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

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

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

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