Alexander
2.01.2018 - 19:21
Доброе время суток форумчане. Мне нужно пустить долгий процесс в фон. Сайт построен на патерне MVC. Процесс представляет собой отправку писем. Пробовал с помощью exec():
exec('php /asynhron.php '.$parameters.' &');
Пишет что невозможно открыть файл указал полный путь, подключился к файлу но пишет что класс UsersCollection не опознан.
asynhron.php:
$parameters = $atrv[1];
$users = new UsersCollection();
$users->notify(1,$parameters);
И тут у меня возник вопрос а возможно ли запустить фоновый процесс чтобы все ранее подключенные Классы и функции сохранились подключенными? так чтобы процесс ушёл в обработку как аякс, но продолжил своё выполнение даже при переходе на другую страницу.
И какие более подходящие варианты запуска фонового процесса можете посоветовать?
Всем спасибо за здравомыслящие и полезные ответы.
AllesKlar
3.01.2018 - 01:29
Складывать письма в очередь. (В базу или еще какой RabbitMQ)
Кроном запускать скрипт, либо вызывать url который будет из очереди брать письма и расылать их себе потихоньку.
_____________
[продано копирайтерам]
Alexander, при выполнении скрипта вызываешь это
http://php.net/manual/ru/function.ignore-user-abort.php, что бы не скрипт не выключался. После чего закрой сессию. Скрипт будет работать дальше, как и другие страницы сайта
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
killer8080
3.01.2018 - 13:25
это плохое решение, воркер должен обрабатывать веб запросы, а не выполнять бэкграунд рутину.
Цитата (Alexander @ 2.01.2018 - 18:21) |
exec('php /asynhron.php '.$parameters.' &'); |
добавить амперсанд недостаточно чтоб процесс ушёл в бэкграунд, нужно ещё и его выходные потоки перенаправить
exec('php /asynhron.php '.$parameters.'>/dev/null 2>&1 &');
для перестраховки можно ещё и через
nohup запускать, чтоб уж наверняка
Цитата (Alexander @ 2.01.2018 - 18:21) |
Пишет что невозможно открыть файл указал полный путь, подключился к файлу но пишет что класс UsersCollection не опознан. asynhron.php: $parameters = $atrv[1]; $users = new UsersCollection(); $users->notify(1,$parameters); |
а автозагрузка там работает? Может ещё быть косяк с относительными путями, инклюдить всегда нужно только с абсолютными.
Цитата (killer8080 @ 3.01.2018 - 13:25) |
это плохое решение, воркер должен обрабатывать веб запросы, а не выполнять бэкграунд рутину. |
это один из вариантов решения данной проблемы, не лучший, но я же не знаю уровень спрашивающего и что он там пишет
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Для небольших обработок, гарантированно в пределах таймаута, можно воспользоваться фишкой fastcgi_finish_request, в случае php-fpm.
В остальных случаях, согласен, правильно сделать через очередь или внешний вызов. У подходов есть вои плюсы и минусы, нужно выбирать под конкретную задачу. Сколько писем в единицу времени здесь будет ролять и как они отправляются. Если через свой MTA, то "в него" уже встроен механизм очереди. Городить поверх еще одну - довольно глупо.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.