PHP

PHP. Как организовать систему очередей?

Чужой сервер посылает на мой сервер запрос, который я должен обработать за короткое время и вернуть какой-то результат.

Но выполнение моего скрипта может затянуться, а потому я посчитал, что лучше будет регистрировать запросы в БД, возвращать серверу результат, а далее с помощью другого скрипта обрабатывать запросы.

Проблема в том, что я не знаю, как обрабатывать записи молниеносно. Крон позволяет запускать скрипт не чаще одного раза в минуту, а это слишком медленно. Мне необходимо обрабатывать записи сразу после их регистрации в бд.
$Белый $
$Белый $
346
Он и не обязан обрабатывать записи молниеносно. Если в вашем приложении присутствуют времязатратные, ресурсоемкие операции, то проблему балансировки нагрузки решают, как правило, с помощью развязки в виде очереди. Т. е. все правильно вы решили. Единствнное что - сообщения очереди можно хранить и в БД, но это будет не очень эффективно, поскольку вам придется реализовывать характерное для такой структуры свойство персистентности. Вопрос - зачем это делать, если уже существуют готовые решения? Рекомендую вам почитать про протокол взаимодействия с очередью - AMQP. В качестве сервера очередей можно рассмотреть, например, rabbitmq. Библиотеки кода для взаимодействия по указанному протоколу на php уже давно написаны, нужно только поискать.

Т. о. в архитектуре вашего приложения будут присутствовать следующие элементы:
Publisher - это скрипт, который принимает запросы с чужого сервера и добавляет сообщения в очередь
Broker - сам сервер очередей
Worker - скрипт, обрабатывающий сообщения из очереди
Главное преимущество этой архитектуры в том, что она позволяет вам масштабировать и параллелить процесс worker'а сколь угодно много. Наиболее просто, на мой взгляд, это реализовать с помощью docker swarm.
SB
Snake Bad |Mikcalson
2 673
Лучший ответ
Поискал информацию по вашей задаче, народ пишет, что можно убрать ограничение времени работы скрипта (set_time_limit(0) и ignore_user_abort(true)) и сделать бесконечный цикл, внутри него будет ожидаться какое-то событие (получение нового запроса), как только оно случилось делаете обработку. Запускать скрипт нужно через консоль (SSH), не через браузер.

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

И кроме таймаута процесс может прервать работу по другим причинам (перезагрузка сервера), нужно предусмотреть контроль (попадалось упоминание supervisord.org).

P.S Уже после набора текста ответа нашел статьи про "демонов", не стал изучать детально, посмотрите сами http://mithrandir.ru/professional/php/php-daemons.html