1. 程式人生 > >PHP中使用ActiveMQ實現訊息佇列

PHP中使用ActiveMQ實現訊息佇列

前面我們已經學了如何部署ActiveMQ
我們知道通過ActiveMQ的一個管理後臺可以檢視任務佇列。

今天

這裡寫圖片描述
用PHP來操作ActiveMQ,我們可以藉助一個第三方擴充套件。
下載:

composer require fusesource/stomp-php:2.0.*

然後新建test.php:

<?php

require __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的佇列中的任務,又是怎麼處理的呢?

<?php

require
__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實現訊息佇列

前面我們已經學了如何部署ActiveMQ, 我們知道通過ActiveMQ的一個管理後臺可以檢視任務佇列。 今天 用PHP來操作ActiveMQ,我們可以藉助一個第三方擴充套件。 下載: composer require fusesource/s

PHP和MySQL實現訊息佇列

最近遇到一個批量傳送簡訊的需求,簡訊介面是第三方提供的。剛開始想到,獲取到手機號之後,迴圈呼叫介面傳送不就可以了嗎? 但很快發現問題:當簡訊數量很大時,不僅耗時,而且成功率很低。 於是想到,用PHP和MySQL實現一個訊息佇列,一條一條的傳送簡訊。下面介紹具體的實現方法: 首先,建立一個

PHP使用AMQP訊息佇列

'password'=> 'guest','vhost' =>'/');$conn = new AMQPConnection($conn_args);$conn->connect();//建立exchange名稱和型別$channel = new AMQPChannel($conn);$ex

到底什麼是訊息佇列?Java如何實現訊息佇列

訊息佇列有無數開源實現,一般沒必要自己實現。zmq也好rabbitmq也好甚至redis也好,找一個合適的裝上用就行 就好像rdbms/nosql一樣 技術都是解決問題的,訊息佇列解決的是將突發大量請求轉換為後端能承受的佇列請求,比如你的伺服器一秒能處理100個訂單,但秒殺活動1秒進來1000個訂單,持續1

PHP利用redis實現訊息佇列處理高併發請求

將請求存入redis 為了模擬多個使用者的請求,使用一個for迴圈替代 //redis資料入隊操作 $redis = new Redis(); $redis->connect('127.0.0.1',6379); for($i=0;$i<50;$i++){

PHP利用redis實現訊息佇列處理高併發請求--簡潔程式碼實現效果

將請求存入redis 為了模擬多個使用者的請求,使用一個for迴圈替代 //redis資料入隊操作 $redis = new Redis(); $redis->connect('127.0.

SpringBoot使用redis實現訊息佇列

在pom中加入redis依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r

使用Redis+php-resque實現訊息佇列

一、Redis安裝 1. 獲取原始碼 shell># cd /usr/local/src shell># wget http://download.redis.io/releases/redis-2.6.16.tar.gz shell># tar -z

實戰Spring4+ActiveMQ整合實現訊息佇列(生產者+消費者)

引言:      最近公司做了一個以資訊保安為主的專案,其中有一個業務需求就是,專案定時監控操作使用者的行為,對於一些違規操作嚴重的行為,以傳送郵件(FoxMail)的形式進行郵件告警,可能是多人,也可能是一個人,第一次是以單人的形式,,直接在業務層需要告警的地方傳送郵件即可,

html5炸金花棋牌開發比較算法在php實現

reac ons tca mon sort data lar class arr PHP中紮金花比大小如何實現 在棋牌遊戲中,不管是現實的還是線上的,紮金花無疑是最熱門棋牌遊戲之一,鄙人從小就酷愛紮金花,機緣巧合後面從事了IT行業,話不多說,直接進去正題吧。 紮金花兩副牌的

Qt應用Redis實現訊息佇列

    類似BS模式,客戶端傳送任務請求給服務端,服務端將處理結果返回給客戶端。 redis負責訊息的儲存和轉發。 模擬病人掛號看病,Patient程序進行掛號,Doctor程序進行看病 ,程式程式碼如下: /////////////

php程序間通訊--訊息佇列

首先我們來看一下如何建立一個訊息佇列。 //建立訊息佇列 $msg_key = ftok( __FILE__, 'a' ); $msg_queue = msg_get_queue( $msg_key, 0666 );  在php中通過這兩句話就可以建立一個訊息佇列。 ftok 函式,是可以

springboot整合redis實現訊息佇列

在java中直接使用redis的時候,直接使用簡單的兩個指令lpush和rpop或者rpush和lpop就可以實現訊息佇列的操作。當與spring結合時,可以使用RedisTemplate和StringRedisTemplate;這兩個Template是spring封裝了對Redis的一些常用的

第八篇:Spring Boot使用Redis實現訊息佇列

目前常用的訊息佇列大概有三種類型,RabbitMQ等AMQP系列, Kafka, Redis等key-value系列,它們的使用場景分別是: 1.RabbitMQ:相對重量級高併發的情況,比如資料的非同步處理,任務的序列執行等. 2.Kafka:基於Pull的模式來處理,具體

php使用redis作為訊息佇列--守護程序模式執行

  出隊指令碼 編寫指令碼,通過crontab定時執行指令碼,從list的右邊取出錯誤處理。 這種方式的優點是不會出現資料的丟失,只有定時指令碼處理完相關資訊之後,才從佇列中取出;缺點也是顯而易見的,響應不夠及時,因為是定時訪問redis的list隊形,所以不能實時的處理佇列中

SpringBoot開發案例之整合Kafka實現訊息佇列

  前言   最近在做一款秒殺的案例,涉及到了同步鎖、資料庫鎖、分散式鎖、程序內佇列以及分散式訊息佇列,這裡對SpringBoot整合Kafka實現訊息佇列做一個簡單的記錄。   Kafka簡介   Kafka是由Apache軟體基金會開發的一個開源流處理平臺,由Scala和Java編寫

《商城專案06》--用ActiveMQ實現訊息的傳送和接收

一, 使用場景 對商品資訊進行操作的同時, 將資料同步到solr庫, 實現該需求有以下幾種方式: 方式1: 在e3-manager-service新增商品資訊的實現類中直接寫將資料新增到solr庫; <弊端: 負責商品資訊操作的開發人員不一定對solr熟悉, 所以得分離出來寫, 這裡可

第 21 講 在Springboot使用Redis實現訊息佇列

第二十一講 在Springboot使用Redis實現訊息佇列 1.引入依賴:pom.xml <dependency> <groupId>org.springframew

PHP高階程式設計之訊息佇列

轉載:https://blog.csdn.net/luyaran/article/details/53034382 1. 什麼是訊息佇列 訊息佇列(英語:Message queue)是一種程序

Redis實現訊息佇列

個人理解在專案中使用訊息佇列一般是有如下幾個原因:    把瞬間伺服器的請求處理換成非同步處理,緩解伺服器的壓力    實現資料順序排列獲取 ​redis實現訊息佇列步驟如下:1).redis函式rpush,lpop2).建議定時任務入佇列3)建立定時任務出佇列 檔案:dem