Недостатки использования команды exec в php-скрипте

В PHP,

 I need to execute background tasks. So I have three choices to run script from 
 following commands:

 1)exec
 2)shell_exec
 3)passthru

 I randomly decided to use exec command in PHP.
 Because All of these have similar characteristics.

Теперь я хочу знать, есть ли какой-нибудь disadvantage of exec() command, который будет работать в фоновом режиме? На самом деле я мало что знаю об этой команде.

Создает ли он отдельный поток от основного потока? Если yes then, есть ли способ очистить или приостановить этот фоновый поток? или it simply forget it after firing the command?

Я спрашиваю об этом, потому что в моем коде нужно run this script very fast one after one within moments. Так создает ли это какую-либо нагрузку на сервер?

EDIT: я использую команду exec следующим образом:

exec("/usr/bin/php /path/to/Notification.php >> /path/to/log_file.log 2>&1 &");

Пожалуйста, помогите мне в этом. Любая помощь будет оценена по достоинству.


person Ponting    schedule 06.09.2013    source источник


Ответы (2)


Это полностью зависит от типа вызова, который вы делаете, будет ли exec() ждать завершения команды или нет. Конечно, запуск большого количества фоновых потоков на сервере потенциально может создать большую нагрузку на ЦП.

Теперь, как правило, любая команда, которую вы запускаете с помощью exec(), НЕ будет выполняться в фоновом режиме, это означает, что ваш PHP-скрипт будет ждать завершения выполнения команды. Чтобы ваши команды выполнялись в фоновом режиме, вы должны перенаправить его поток вывода и явно указать ему работать в фоновом режиме, добавив это в свою команду:

> /dev/null 2>/dev/null &

Конечно, недостатком этого будет то, что вы никогда не сможете получить какие-либо результаты своих команд обратно в PHP. Это будет огонь и забыть.

person ciruvan    schedule 06.09.2013
comment
Хорошо. Я использую только это. Пожалуйста, посмотрите мой отредактированный вопрос. Единственное отличие состоит в том, что я использую /path/to/log_file.log 2›&1 & вместо /dev/null 2›/dev/null &. Требуется ли время, если я распечатаю журнал в log_file? Спасибо. - person Ponting; 06.09.2013
comment
Почему вы запускаете PHP-скрипт из PHP, используя exec()? Почему бы вам просто не включить файл? В любом случае перенаправление вывода в файл также поможет. - person ciruvan; 06.09.2013
comment
Потому что я отправляю push-уведомление APNS, включив другой файл в Notification.php. - person Ponting; 06.09.2013
comment
Подскажите, пожалуйста, как мне использовать › /dev/null 2›/dev/null & с exec(/usr/bin/php /path/to/Notification.php ›› /path/to/log_file.log 2 ›&1 &), чтобы журнал не печатался? - person Ponting; 06.09.2013
comment
Я ответил на ваш вопрос, пожалуйста, либо примите, либо понизьте мой ответ, но задавать много дополнительных вопросов не очень вежливо в StackOverflow. - person ciruvan; 06.09.2013

поскольку вы перенаправляете как стандартный вывод, так и вывод ошибок в файл, я не думаю, что есть какие-либо проблемы, используете ли вы exec, shell_exec или passthru здесь.

насколько я знаю, это их основные различия

shell_exec(): возвращает весь стандартный вывод (на терминале ничего не отображается)

exec(): то же самое, что и shel_exec(), но возвращает только последнюю строку стандартного вывода

passthru(): это похоже на вызов команды, она покажет вывод на терминал, а не вернет его.

person Donald    schedule 06.09.2013