標籤:iss 擴充 bool 內容 json server ++ tle blog
前面我們已經學了如何部署ActiveMQ,
我們知道通過ActiveMQ的一個管理後台可以查看任務隊列。
今天
用PHP來操作ActiveMQ,我們可以藉助一個第三方擴充。
下載:
composer require fusesource/stomp-php:2.0.*
然後建立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‘=>‘[email protected]‘,‘content‘=>‘test‘);$result = $connect->send(‘email‘,json_encode($data));
我們在MQ後台可以查看訊息詳細
上面的代碼到這裡,還不夠完美。如果我們伺服器重啟了activemq,沒有處理的訊息會丟失。
這個時候我們需要用到send()方法的第三個參數。
//訊息持久化 persistent為true,字串的‘true‘$result = $connect->send(‘email‘,json_encode($data),array(‘persistent‘=>‘true‘));
前面我們完成了『發送』
給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":"[email protected]","content":"test"})
body就把我們發送的內容讀取出來了。
我們迴圈讀取(死迴圈)一直等待新訊息:
do{ if ($connect->hasFrameToRead()){ $frame = $connect->readFrame(); print_r($frame->body); }} while (true);
處理訊息之後(在發送郵件等業務完成之後),要通知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 email sleep(2); //類比延時 //最後通知mq,我們已經處理了該條訊息 $connect->ack($frame); } //控制迴圈 $next = true; if (file_exists(__DIR__.‘/stop‘)){ //如果有名為stop的一個檔案 //就不迴圈了 $next = false; }} while ($next);
PHP中使用ActiveMQ實現訊息佇列