Рубрики
Uncategorized

PHP использует ActiveMQ для реализации очереди сообщений

Автор оригинала: David Wong.

В этой статье показано, как 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 – программ для всех.