@entermix

Как правильно запустить внешний скрипт в фоновом режиме?

Есть PHP 7.2 (CGI), для примера добавляем 2 простых скрипта:

sleep.php:
<?php
sleep(30);


background.php:
<?php
exec("su -s /bin/sh - user -c cd /var/www/user/data/www/example.com/ && /opt/php72/bin/php -q /var/www/user/data/www/example.com/sleep.php > /dev/null 2>&1 &");


Консоль:
cd /var/www/user/data/www/example.com/ && /opt/php72/bin/php -q /var/www/user/data/www/example.com/background.php


В файле background.php мы запускаем команду в фоновом режиме, но скрипт зависает на 30 секунд, почему так происходит?

В документации сказано:

Замечание:
Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.


Проблема с окружением? Как это настраивается? Что я делаю не так?
  • Вопрос задан
  • 196 просмотров
Решения вопроса 1
@ffosters
background.php:
$command = "(su -s /bin/sh - user -c cd /var/www/user/data/www/example.com/ && /opt/php72/bin/php -q /var/www/user/data/www/example.com/sleep.php) >/dev/null 2>&1 &";

exec($command);


https://florian.ec/articles/running-background-pro...
https://stackoverflow.com/questions/14541741/how-d...
https://unix.stackexchange.com/questions/3886/diff...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kotomyava
@kotomyava
Системный администратор
Всё работает так, как должно быть, вы что-то странное ожидаете просто.

Вызов exec блокируется до окончания выполнения.
Цепочка вызовов через && выполняется последовательно.

Для порождения отдельных дочерних процессов, можно использовать pcntl_fork и.т.п.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы