php shell_exec () нужна помощь для запуска скрипта в фоновом режиме - PullRequest
2 голосов
/ 30 марта 2012

Мой проект требует 3 php-скриптов, которые выполняются с условиями if-else.Первый скрипт загружается на страницу индекса сайта, чтобы проверить, установлено ли условие, и если это так, он вызывает второй скрипт.Второй сценарий проверяет, установлены ли другие условия, и, наконец, вызывает последний сценарий, если все хорошо.

Теперь я мог бы сделать это, просто включив сценарии в оператор if, но после получения конечного результатаявляется ресурсом, занимающим дамп MySQL, мне нужно, чтобы он запускался независимо от исходной страницы триггера.

Кроме того, эти сценарии должны продолжать выполнять свои действия после запуска независимо от действий пользователя на странице индекса.

И последнее: он должен работать на win и nix.

Как бы вы это сделали?

Имеет ли смысл следующий код?

if ($blah != $blah-size){
shell_exec ('php first-script.php > /dev/null 2>/dev/null &'); 
 }
//If the size matches, die
else {
 }

Заранее спасибо за миллион.

ОБНОВЛЕНИЕ: на тот случай, если кто-то другой заключит такую ​​же сделку.Кажется, что в php есть ошибка при запуске скриптов как cgi, но командная строка в Apache работает со всеми протестированными версиями.

См. Ошибку https://bugs.php.net/bug.php?id=11430

, поэтому вместо этого я вызываюскрипт такой:

exec("php-cli mybigfile.php > /dev/null 2>/dev/null &"); 

Или вы можете назвать его оболочкой.Он работает на системах nix, но мои локальные окна безнадежны, поэтому, если кто-нибудь запускает его на Windows, и он работает, пожалуйста, обновите его.

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

Я бы не стал это делать с помощью shell exec, потому что у вас не было бы никакого контроля над тем, сколько из этих процессов захвата ресурсов будет выполняться одновременно. Таким образом, пользователь может щелкнуть, щелкнуть, щелкнуть, щелкнуть и, по сути, остановить вашу машину.

Вместо этого я бы построил рабочую очередь. Вместо непосредственного запуска дампа сценарий отправляет запись в какую-то очередь FIFO (может быть таблицей базы данных или текстовым файлом в директории) и затем немедленно возвращается. Затем у вас будет скрипт cron, который выполняется через регулярные промежутки времени и проверяет очередь, чтобы увидеть, есть ли какая-либо работа. Если это так, он выбирает самую старую вещь и запускает ее. Таким образом, вы уверены, что когда-либо запускаете только один дамп за раз.

1 голос
/ 30 марта 2012

Самый простой способ, которым я могу думать, это то, что вы можете сделать

exec ("screen -d -m php long-running-script.php");

и он сразу же вернется и запустится в фоновом режиме. Экран позволит вам подключиться к нему и посмотреть, что происходит.

Вы также можете сделать то, что делаете, с помощью nohup php long-running-script.php или написав простое приложение на C, которое выполняет daemonize () и затем исполняет ваш скрипт.

...