PHP中使用ActiveMQ实现消息队列
生活随笔
收集整理的這篇文章主要介紹了
PHP中使用ActiveMQ实现消息队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
PHP中使用ActiveMQ實現消息隊列前面我們已經學了如何部署ActiveMQ, 我們知道通過ActiveMQ的一個管理后臺可以查看任務隊列。今天 這里寫圖片描述 用PHP來操作ActiveMQ,我們可以借助一個第三方擴展。 下載:composer require fusesource/stomp-php:2.0.* 1 然后新建test.php:<?phprequire __DIR__.'/vendor/autoload.php'; //引入自動加載的文件$connect = new \FuseSource\Stomp\Stomp('tcp://10.211.55.13/:61613'); $connect->connect();$userId = 1001; $result = $connect->send('email',$userId); //比如發郵件 var_dump($result);這里寫圖片描述 發送消息成功,打印bool(true)我們在ActiveMQ自帶的管理后臺查看,確實有一個名為”email”的隊列。 這里寫圖片描述上面我們發送的一個id,我們還可以發送json數據。$data = array('id'=>1001,'email'=>'110@qq.com','content'=>'test'); $result = $connect->send('email',json_encode($data)); 1 2 我們在MQ后臺可以查看消息詳細 這里寫圖片描述上面的代碼到這里,還不夠完美。如果我們服務器重啟了activemq,沒有處理的消息會丟失。 這個時候我們需要用到send()方法的第三個參數。//消息持久化 persistent為true,字符串的'true' $result = $connect->send('email',json_encode($data),array('persistent'=>'true')); 1 2 前面我們完成了『發送』 給mq服務器發送消息(email消息)。 那么在mq的隊列中的任務,又是怎么處理的呢?<?phprequire __DIR__.'/vendor/autoload.php'; //引入自動加載的文件$connect = new \FuseSource\Stomp\Stomp('tcp://10.211.55.13/:61613'); $connect->connect();//訂閱隊列消息 $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":"110@qq.com","content":"test"} )body就把我們發送的內容讀取出來了。我們循環讀取(死循環)一直等待新消息:do{if ($connect->hasFrameToRead()){$frame = $connect->readFrame();print_r($frame->body);} } while (true); 1 2 3 4 5 6 處理消息之后(在發送郵件等業務完成之后),要通知mq我處理了該條消息了if ($connect->hasFrameToRead()){$frame = $connect->readFrame();//print_r($frame->body);//做業務邏輯//具體發送郵件的業務//send email//最后通知mq,我們已經處理了該條消息$connect->ack($frame);}我們還可以在優化一下代碼,解決死循環,控制循環(這里是一種方案演示)do{//會等待,直到有可用消息,才執行后面代碼if ($connect->hasFrameToRead()){$frame = $connect->readFrame();//print_r($frame->body);//做業務邏輯//具體發送郵件的業務//send emailsleep(2); //模擬延時//最后通知mq,我們已經處理了該條消息$connect->ack($frame);}//控制循環$next = true;if (file_exists(__DIR__.'/stop')){//如果有名為stop的一個文件//就不循環了$next = false;} } while ($next);更多內容請關注我的訂閱號:
轉載于:https://my.oschina.net/yonghan/blog/1648615
總結
以上是生活随笔為你收集整理的PHP中使用ActiveMQ实现消息队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安全测试的目的,发现哪些问题
- 下一篇: 初探 es6 promise