[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Асинхронный php запрос
Alexander
Доброе время суток форумчане. Мне нужно пустить долгий процесс в фон. Сайт построен на патерне MVC. Процесс представляет собой отправку писем. Пробовал с помощью exec():
exec('php /asynhron.php '.$parameters.' &');
Пишет что невозможно открыть файл указал полный путь, подключился к файлу но пишет что класс UsersCollection не опознан.
asynhron.php:
$parameters = $atrv[1];
$users = new UsersCollection();
$users->notify(1,$parameters);

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

Всем спасибо за здравомыслящие и полезные ответы.
AllesKlar
Складывать письма в очередь. (В базу или еще какой RabbitMQ)
Кроном запускать скрипт, либо вызывать url который будет из очереди брать письма и расылать их себе потихоньку.


_____________
[продано копирайтерам]
chee
Alexander, при выполнении скрипта вызываешь это
http://php.net/manual/ru/function.ignore-user-abort.php, что бы не скрипт не выключался. После чего закрой сессию. Скрипт будет работать дальше, как и другие страницы сайта

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
killer8080
Цитата (chee @ 3.01.2018 - 08:15)
при выполнении скрипта вызываешь это
http://php.net/manual/ru/function.ignore-user-abort.php, что бы не скрипт не выключался.

это плохое решение, воркер должен обрабатывать веб запросы, а не выполнять бэкграунд рутину.

Цитата (Alexander @ 2.01.2018 - 18:21)
exec('php /asynhron.php '.$parameters.' &');

добавить амперсанд недостаточно чтоб процесс ушёл в бэкграунд, нужно ещё и его выходные потоки перенаправить
exec('php /asynhron.php '.$parameters.'>/dev/null 2>&1 &');

для перестраховки можно ещё и через nohup запускать, чтоб уж навернякаuser posted image

Цитата (Alexander @ 2.01.2018 - 18:21)
Пишет что невозможно открыть файл указал полный путь, подключился к файлу но пишет что класс UsersCollection не опознан.
asynhron.php:
$parameters = $atrv[1];
$users = new UsersCollection();
$users->notify(1,$parameters);

а автозагрузка там работает? Может ещё быть косяк с относительными путями, инклюдить всегда нужно только с абсолютными.
chee
Цитата (killer8080 @ 3.01.2018 - 13:25)
это плохое решение, воркер должен обрабатывать веб запросы, а не выполнять бэкграунд рутину.

это один из вариантов решения данной проблемы, не лучший, но я же не знаю уровень спрашивающего и что он там пишет

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Ron
Для небольших обработок, гарантированно в пределах таймаута, можно воспользоваться фишкой fastcgi_finish_request, в случае php-fpm.

В остальных случаях, согласен, правильно сделать через очередь или внешний вызов. У подходов есть вои плюсы и минусы, нужно выбирать под конкретную задачу. Сколько писем в единицу времени здесь будет ролять и как они отправляются. Если через свой MTA, то "в него" уже встроен механизм очереди. Городить поверх еще одну - довольно глупо.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.