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

Асинхронная обработка или очереди сообщений в 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 или пламя на этом?

4b9b3361

Ответ 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 и функции, такие как параллельная задача, масштабирование, мониторинг и т.д.