Какие есть хорошие распределенные менеджеры очередей в php?

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

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

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


person reconbot    schedule 18.03.2009    source источник


Ответы (3)


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

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

person Mat Schaffer    schedule 18.03.2009

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

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

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

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

person Milan Babuškov    schedule 18.03.2009
comment
Мне нравится подход inittab - php имеет тенденцию к утечке памяти с течением времени, поэтому его смерть раз в минуту может быть неплохой идеей. - person reconbot; 18.03.2009
comment
Я использую сценарий оболочки, который в конце выполняет «exec $ 0» для повторного запуска. Клиент может выйти по желанию и перезапуститься. - person Alister Bulman; 07.04.2009

Zend_Framework имеет класс очереди с рядом реализаций, поддерживаемых Mysql, SQS и некоторыми другими серверными частями.

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

person Alister Bulman    schedule 07.04.2009