В этой статье показано, как PHP использует ActiveMQ для реализации очереди сообщений. Поделитесь для вашей справки следующим образом:
Мы уже узнали, как развернуть ActiveMQ. Мы знаем, что очереди задач можно просматривать с помощью административного фона ActiveMQ.
Сегодня
Используя PHP для работы с ActiveMQ, мы можем использовать стороннее расширение. Скачать:
composer require fusesource/stomp-php:2.0.*
Затем создайте новый test.php:
connect(); $userId = 1001; $result = $connect - > send ('email', $userId); //e.g. email var_dump($result);
Успешно отправить сообщение, распечатать bool(true)
Мы проверили административную базу ActiveMQ, и у нас действительно была очередь под названием “электронная почта”.
Выше мы отправляем идентификатор, мы также можем отправлять данные JSON.
$data = array('id'=>1001,'email'=>'[email protected]','content'=>'test'); $result = $connect->send('email',json_encode($data));
Мы можем просмотреть подробную информацию о сообщении в фоновом режиме MQ.
Приведенный выше код недостаточно совершенен. Если наш сервер перезапустится activemq , необработанные сообщения будут потеряны. Нам нужно использовать его в это время. отправить()
Третий параметр метода.
// Message persistent is true, string'true' $result = $connect->send('email',json_encode($data),array('persistent'=>'true'));
Мы уже закончили Отправку.
Отправьте сообщение (сообщение электронной почты) на сервер MQ. Итак, как насчет задач в очереди MQ?
connect(); // Subscribe to queue messages $connect->subscribe('email'); if ($connect->hasFrameToRead()){ $frame = $connect->readFrame(); print_r($frame); }
На сервере MQ подпишитесь на сообщения очереди (прослушивание). На стороне сервера выполните в командной строке: php mqServer.php
Если есть сообщение, которое не было обработано, его можно прочитать и распечатать следующим образом:
FuseSource\Stomp\Frame Object ( [command] => MESSAGE [headers] => Array ( [expires] => 0 [destination] => /queue/email [priority] => 4 [message-id] => ID:localhost.localdomain-38488-1488196907415-3:2:-1:1:1 [timestamp] => 1489477647931 ) [body] => {"id":1001,"email":"[email protected]","content":"test"} )
тело
Зачитайте то, что мы послали.
Мы читаем циклы (мертвые циклы) в ожидании новых сообщений:
do{ if ($connect->hasFrameToRead()){ $frame = $connect->readFrame(); print_r($frame->body); } } while (true);
После обработки сообщения (после завершения отправки почты и других дел) мне нужно уведомить MQ о том, что я обработал сообщение.
if ($connect->hasFrameToRead()){ $frame = $connect->readFrame(); //print_r($frame->body); // Do business logic // Specific business of sending mail //send email // Finally, inform MQ that we have processed the message $connect->ack($frame); }
Мы также можем оптимизировать код, решить мертвый цикл, контролировать цикл (вот демонстрация схемы).
do{ // Wait until a message is available to execute the following code if ($connect->hasFrameToRead()){ $frame = $connect->readFrame(); //print_r($frame->body); // Do business logic // Specific business of sending mail //send email Sleep (2); // simulated delay // Finally, inform MQ that we have processed the message $connect->ack($frame); } // Control cycle $next = true; if (file_exists(__DIR__.'/stop')){ // If you have a file named stop // No more cycles $next = false; } } while ($next);
Больше читателей, интересующихся контентом, связанным с PHP, могут ознакомиться с темами этого сайта: Курс по структуре и алгоритмам данных PHP, Краткое описание алгоритмов программирования PHP, Краткое описание использования строк Php, Полный набор навыков работы с массивами PHP, Краткое описание распространенных Алгоритмов и методов обхода PHP, а также Математические навыки работы с PHP. Резюме
Я надеюсь, что эта статья будет полезна для разработки PHP – программ для всех.