Запуск PHP из ActiveMQ - PullRequest
       39

Запуск PHP из ActiveMQ

6 голосов
/ 27 мая 2010

Справочная информация: Наша текущая система включает в себя две службы (одна написана на Java, другая на PHP), которые взаимодействуют друг с другом с помощью обратных вызовов HTTP. Мы хотели бы перейти от обратных вызовов HTTP к архитектуре на основе сообщений, используя ActiveMQ (или другой, если необходимо). Вероятно, мы будем использовать STOMP для связи между ними. Со временем служба PHP будет переписана на Java, но это не является частью этого проекта.

Вопрос: Как система ActiveMQ может уведомить PHP о том, что новое сообщение было отправлено в очередь, на которую подписана система PHP? В текущей системе обратный вызов неотъемлемо вызывает PHP и запускает его. Это уходит с архитектурой на основе сообщений.

Возможные решения:

  • Cron регулярно вызывает скрипт PHP, который проверяет наличие новых сообщений. Тьфу.
  • Длительный процесс PHP, который зацикливается и спит и проверяет наличие новых сообщений. меньше гадость?
  • ActiveMQ вызывает скрипт PHP, когда публикуется новое сообщение. хорошо, как?
  • ??

Ответы [ 4 ]

4 голосов
/ 28 мая 2010

Выезд Верблюд . Он может работать внутри ActiveMQ или сам по себе. Верблюд создает «маршруты» для сообщений. В этом случае я бы предложил оставить URL-адрес обратного вызова PHP как есть и установить в Camel маршрут, который будет принимать сообщения из очереди и отправлять их по URL-адресу обратного вызова. Затем вы можете использовать Stomp в PHP для отправки сообщений в ActiveMQ. Ваш Java-код может использовать JMS как для входящих, так и для исходящих сообщений.

0 голосов
/ 07 июля 2010

Я думаю, что проблема, которую они пытаются решить, состоит в том, что стек LAMP (частью которого является PHP) неотъемлемо связан с механизмом запроса / ответа, который на него навязывает протокол HTTP, поэтому у него есть Потребитель (который проверяет ActiveMQ) очередь, написанная на PHP, работоспособна, но время жизни процессов естественно ограничено любым таймаутом в протоколе HTTP. решение является одним из:

1 - Не запускайте подписчик PHP внутри apache / HTTP, и в результате вы можете выполнить set_time_limit (0), и подписчик php будет работать вечно (до тех пор, пока он не выйдет из строя), ИЛИ

2 - Поймите, что подписчик действительно выполняет "периодические" проверки, с большим количеством промежуточных элементов, поэтому вместо while (1) {do_queue_stuff (); спать(); } вы удаляете сон, удаляете цикл while и вызываете его повторно из Cron или подобного.

У каждого есть свои преимущества, но оба одинаково хороши, ЕСЛИ частота cron () достаточно настраиваема. Мой Cron ограничен бегом каждую минуту, что не очень часто, поэтому мне придется сделать комбинацию из двух выше: звонить из cron каждую минуту:

time = what_minute_is_it (); while (what_minute_is_it () == время) { do_queue_stuff (); сон (1); }

Я думаю, что люди могут искать то, как система ActiveMQ «намекнет» на систему PHP Consumer, что в очереди может быть что-то, что требует обработки, и, как следствие, экономит на всех этих началах обработки очереди / остановка / сон / и прочее, если на самом деле ничего не поделаешь. Похоже, верблюд - способ сделать это.

0 голосов
/ 27 мая 2010

Вопрос: Как система ActiveMQ может уведомить PHP о том, что новое сообщение было отправлено в очередь, на которую подписана система PHP? В текущей системе обратный вызов неотъемлемо вызывает PHP и запускает его. Это уходит с архитектурой на основе сообщений.

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

0 голосов
/ 27 мая 2010

Может ли ActiveMQ выполнять команды оболочки? Если это так, просто попросите ActiveMQ выполнить скрипт PHP через командную строку всякий раз, когда появляется новое сообщение для обработки. Это избавляет вас от выполнения заданий cron и от длительного цикла PHP.

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