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