Подтвердить что ты не робот

Что такое хорошие распределенные диспетчера очереди в php?

Я работаю над веб-сайтом обработки изображений, вместо того чтобы иметь длительные задания, задерживая браузер пользователей. Я хочу, чтобы все команды быстро возвращались с идентификатором задания и выполняли фоновую задачу. Затем идентификатор можно было использовать для проверки состояния и результатов (т.е. URL-адреса обработанного изображения). Я нашел много распределенных менеджеров очереди для ruby, java и python, но я не знаю почти любого из этих языков, чтобы иметь возможность использовать их.

Мои собственные тесты были с общей базой данных mysql для задания очередей, блокировки их для рабочего и пометки их как завершенных (сохранение возвращаемых данных в db). Это был просто грязный прототип, и все время я чувствовал, что я изобретаю колесо (и не очень изящно). Есть ли что-то в php (или я могу поговорить с RESTfully?), Что я мог бы использовать?

Считая немного больше, я обнаружил, что то, что я ищу, это система очередей, которая имеет php api, ее не нужно писать на php. Я только нашел классы для использования с Amazon SQS, но не только это не бесплатно, но и довольно скрыто (более минуты, чтобы сообщение появилось).

4b9b3361

Ответ 1

Вы пробовали ActiveMQ? В нем упоминается поддержка PHP через протокол Stomp. Подробности доступны на сайте activemq.

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

Ответ 2

У вас есть полный контроль над сервером?

В этом случае очередь MySQL может быть в порядке. Имейте PHP script, который работает постоянно (в бесконечном цикле while), запрашивая базу данных MySQL для новых "задач" и sleep() между ними, чтобы уменьшить нагрузку во время простоя.

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

Чтобы предотвратить остановку всего этого, если ваш script сбой/существует (переполнение памяти PHP и т.д.), вы можете, например, поместить его в inittab (если вы используете Linux в качестве сервера), и init перезапустит его автоматически.

Ответ 3

Zend_Framework имеет класс очереди с несколькими реализациями Mysql-backed, SQS и некоторых других back-end.

Лично у меня недавно были отличные результаты с BeanstalkD, в котором также есть клиент PHP. Я просто сериализую некоторые данные с JSON, чтобы выбросить в него, который декодируется и запускается на рабочем столе.