Сведения о вопросе

Kimsanov

10:19, 12th August, 2020

Теги

PHP: запуск задачи в фоне

Просмотров: 330   Ответов: 5

Какие самые правильные и надежные подходы стоит использовать, если необходимо запустить некую длительную задачу в фоновом режиме?
Приведу пример, чтобы стало понятней:
есть основной php скрипт, контроллер, который обрабатывает пользовательские действия. Пользователь нажимает в интерфейсе волшебную кнопку, которая должна запустить долгоиграющую задачу и вернуть управление пользователю. При этом не требуется возвращать или как то дополнительно обрабатывать результат работы длительного скрипта.

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

Спасибо.



  Сведения об ответе

DO__IT

17:24, 18th August, 2020

По-моему, в вашем случае самым простым вариантом будет exec:

exec("php /www/site/script.php >>/www/logs/script.log 2>&1 &");

К сожалению это будет работать только в *nix, потому что в Windows запустить процесс в фоне не так то просто


  Сведения об ответе

PIRLO

15:38, 27th August, 2020

PHP CLI в фоне ведет себя плохо. Из того, что применяется «на скорую руку», хорошо себя ведут BASH, Perl и Python.

В задаче, где надо было беречь ресурсы, поступил так:
1. Скрипт на PHP сохраняет «задание» на BASH в некоторую директорию job
2. Крон ежеминутно запускает некий скрипт dispatcher, написанный на Perl (был жизнеспособный вариант и на BASH) который ищет N самых старых (по last modified time) скриптов из директории job, и запускает их.
3. Запускаемые скрипты первым делом уничтожают (rm) себя, чтобы не Они все равно выполнятся — ведь они уже загружены в ОЗУ. Результаты работы сохраняются в ФС или в БД, для обслуживания логики интерфейса

Число N для каждого конкретного сервера выявляется индивидуально — тестированием.

Был «подводный камень», который по первому разу даже был обнаружен совершенно невовремя — все, что запускает крон, должно работать с абсолютными путями.

Таким образом были сделаны проект вроде ютуба и аналогичный, тоже конвертирующий видео.


  Сведения об ответе

pumpa

13:21, 11th August, 2020

Я тоже придерживаюсь варианта с CRON-ом.
Лично я бы складывал бы задачи в таблицу в БД, где фиксировались бы статусы выполнения задач, а в кроне ежеминутно отрабатывал бы некий скрипт (хоть на php хоть на чем другом), который бы чекал эту таблицу, запускал новые задачи, и удалял уже отработанные.


  Сведения об ответе

VERSUION

09:08, 28th August, 2020

Как вариант: пользователь нажимает кнопку — ajax-запросом на сервере запускается php-скрипт (с ignore_user_abort).


  Сведения об ответе

DAAA

02:37, 29th August, 2020

1. Агенты — запускают в конце генерации страницы.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться