У меня есть несколько сценариев командной строки на 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
Перенаправление 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, вы можете назначить вывод этой команды переменной.
Вам необязательно что-то делать с переменной, что означает, что вы эффективно подавляете вывод.
Надеюсь, это поможет!