Асинхронная обработка или очереди сообщений в PHP (CakePHP)
Я создаю веб-сайт в CakePHP, который обрабатывает файлы, загруженные с помощью API XML-RPC и, хотя веб-интерфейс. Файлы должны быть проверены ClamAV, необходимо создать эскизы и т.д. Вся ресурсоемкая работа, требующая времени, для которого пользователю не нужно ждать. Итак, я изучаю асинхронную обработку с PHP в целом и CakePHP в частности.
Я наткнулся на плагин MultiTask для CakePHP, который выглядит многообещающим. Я также встретил различные реализации очереди сообщений, такие как dropr и beanstalkd. Конечно, мне также понадобится какой-то фоновый процесс, возможно, реализованный с использованием Cake Shell. Я видел MultiTask, используя PHP_Fork для реализации многопоточного PHP-демона.
Мне нужен совет о том, как наилучшим образом подобрать все эти штуки.
- Это хорошая идея иметь давнего демона, написанного на PHP? О чем я должен следить?
- В чем преимущество внешних реализаций очереди сообщений? Плагин MultiTask не использует внешнюю очередь сообщений. Он запускает его самостоятельно, используя таблицу MySQL для хранения задач.
- Какую очередь сообщений я должен использовать? dropr? beanstalkd? Что-то еще?
- Как мне реализовать серверный процессор? Является ли PHP-демоник forking хорошей идеей или просто просит проблемы?
Мой текущий план - либо использовать плагин MultiTask, либо отредактировать его, чтобы использовать beanstald вместо собственной реализации таблицы MySQL. Задания в очереди могут состоять только из имени задачи и массива параметров. Демон PHP будет следить за входящими заданиями и передавать их одному из дочерних потоков. Он просто выполнил бы задачу CakePHP с заданными параметрами.
Любое мнение, советы, комментарии, gotchas или пламя на этом?
Ответы
Ответ 1
У меня были отличные результаты с BeanstalkD и фоновый код, написанный на PHP, для получения заданий, а затем действия на них. Я завернул фактический запуск работы в bash - script, чтобы продолжить работу, даже если он вышел (если я не сделаю "exit(UNIQNUM);
", когда script проверяет и фактически завершает работу). Таким образом, перезапущенный PHP скрипт очищает любую память, которая может быть использована, и может запускаться заново каждые 25/50/100 заданий, которые она запускает.
Пара преимуществ использования заключается в том, что вы можете устанавливать приоритеты и задержки в задание BeanstalkD - "запускать это с меньшим приоритетом, но не начинать в течение 10 секунд". Я также поставил несколько заданий в определенное время (запустите это сейчас, через 5 секунд и снова через 30 секунд).
С соответствующей конфигурацией сети (и ее запуском на доступном IP-адресе к остальной части вашей сети) вы также можете запустить beanstalkd deamon на одном сервере и опросить его с нескольких других компьютеров, поэтому, если это большое количество задач, сгенерированных, работа может быть разделена между серверами. Если конкретный набор задач необходимо запускать на определенном компьютере, я создал "трубу", которая является тем машинным именем хоста, которое должно быть уникальным в нашем кластере, если не глобально (полезно для загрузки файлов). Я нашел, что он отлично работает для изменения размера изображения, часто возвращая готовые меньшие изображения в файловую систему до того, как сама веб-страница, которая будет ссылаться на нее, будет ссылаться на URL-адрес, к которому он будет прибывать.
На самом деле я собираюсь начать серию статей по этому предмету для своего блога (включая некоторые методы для кода, которые я уже нажал на несколько миллионов прямых запросов). Мой URL-адрес связан с моим профиль пользователя здесь, на Stackoverflow.
(Я написал серию статей по теме Beanstalkd и очередности заданий)
Ответ 2
Если вы используете очередь сообщений, например beanstalkd, вы можете запустить столько процессов, сколько захотите (даже на одном сервере). Каждый рабочий процесс займет одно задание из очереди и обработает его. Вы можете добавить больше рабочих и больше серверов, если вам требуется больше возможностей.
Самое приятное в использовании однопоточного работника заключается в том, что вам не нужно иметь дело с синхронизацией внутри процесса. Задание должно гарантировать, что никакая работа не будет обработана дважды.
Ответ 3
Возможно также стоит проверить Amazon SQS для использования в сочетании с EC2?
Ответ 4
Как насчет Гирмана? Хорошая поддержка и интеграция в php и функции, такие как параллельная задача, масштабирование, мониторинг и т.д.