Я работаю над веб-сайтом обработки изображений, вместо того чтобы иметь длительные задания, задерживать браузер пользователей. Я хочу, чтобы все команды быстро возвращались с идентификатором задания и выполняли фоновые задачи. Затем идентификатор можно было использовать для проверки состояния и результатов (т. Е. URL-адреса обработанного изображения). Я нашел много распределенных менеджеров очереди для ruby, java и python, но я не знаю почти любого из этих языков, чтобы иметь возможность использовать их.
Мои собственные тесты были с общей базой данных mysql для работы в очереди, блокировки их для рабочего и пометки их как завершенных (сохранение возвращаемых данных в db). Это был просто грязный прототип, и все время я чувствовал, что я изобретаю колесо (и не очень изящно). Есть ли что-то в php (или я могу поговорить с RESTfully?), Что я мог бы использовать?
Читая немного больше, я обнаружил, что то, что я ищу, это система очередей, в которой есть php api, ее не нужно писать на php. Я только нашел классы для использования с SQS от Amazon, но не только это не бесплатно, но и довольно скрыто (более минуты, чтобы сообщение появилось).
Вы пробовали ActiveMQ? В нем упоминается поддержка PHP через протокол Stomp. Подробности доступны на сайте activemq .
Я получил много пробега из подхода к базе данных, описывающего вас, поэтому я не стал бы слишком беспокоиться об этом.
У вас есть полный контроль над сервером?
В этом случае очередь MySQL может быть прекрасной. У вас есть PHP-скрипт, который работает постоянно (в бесконечном цикле while), запрашивая базу данных MySQL для новых «задач» и sleep () между ними, чтобы уменьшить нагрузку во время простоя.
Когда каждая задача будет завершена, отметьте ее в базе данных и перейдите к следующей.
Чтобы предотвратить остановку всего этого файла, если ваш сценарий выйдет из строя / существует (переполнение памяти PHP и т. Д.), Вы можете, например, поместить его в inittab (если вы используете Linux в качестве сервера), и init перезапустит его автоматически.
Zend_Framework имеет класс очереди с несколькими реализациями Mysql-backed, SQS и некоторых других back-end.
Лично у меня недавно были отличные результаты с BeanstalkD , у которого также есть клиент PHP. Я просто сериализую некоторые данные с JSON, чтобы бросить в него, который декодируется и запускается на рабочих (-ов).