PHP中使用ActiveMQ實現訊息佇列

來源:互聯網
上載者:User

標籤: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實現訊息佇列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.