php隊列的實現
㈠ 求問php可以對MQ隊列實現監聽嗎
簡介 前面篇文章討論幾種應用系統集式發現實際面向消息隊列集案算總體比較合理選擇我先針具體消息隊列Activemq基本通信式進行探討activemqJMS消息通信規范實現總說消息規范面定義見幾種消息通信模式主要發布-訂閱、點點兩種另外通結合些模式具體應用我處理某些應用場景候衍種請求應答模式面我針幾種式討論 基礎流程 討論具體式候我先看看使用activemq需要啟服務主要程 按照JMS規范我首先需要獲JMS connection factory.通connection factory創建connection.基礎我再創建session, destination, procerconsumer主要幾步驟: 一. 獲JMS connection factory. 通我提供特定環境連接信息構造factory 二. 利用factory構造JMS connection 三. 啟connection 四. 通connection創建JMS session. 5. 指定JMS destination. 陸. 創建JMS procer或者創建JMS message並提供destination. 漆. 創建JMS consumer或注冊JMS message listener. 吧. 發送接收JMS message. 9. 關閉所JMS資源包括connection, session, procer, consumer等 publish-subscribe 發布訂閱模式點類似於我訂閱報紙每尾候郵局發本報紙集合讓我選擇訂閱哪表列所版發行報紙於我每訂閱者說我選擇份或者份報紙比北京報、瀟湘晨報等些我訂閱報紙相於發布訂閱模式topic訂閱報紙能我訂閱相同報紙相於我同topic注冊於份報紙發行說所訂閱者構一關
㈡ PHP-php 怎麼實現消息隊列
消息隊列
消息隊列是線程間通訊的手段:
import java.util.*
public class MsgQueue{
private Vector queue = null;
public MsgQueue(){
queue = new Vector();
}
public synchronized void send(Object o)
{
queue.addElement(o);
}
public synchronized Object recv()
{
if(queue.size()==0)
return null;
Object o = queue.firstElement();
queue.removeElementAt(0);//or queue[0] = null can also work
return o;
}
}
因為java中是locked by object的所以添加synchronized 就可以用於線程同步鎖定對象
可以作為多線程處理多任務的存放task的隊列。他的client包括封裝好的task類以及thread類
㈢ 請教PHP+Redis實現任務隊列的思路
// 創建請求ID標志, uniqid 無法保證唯一, 自己去搜索生成唯一的方法
$uuid = uniqid();
$tsk_name = "mytask";
$time_out = 30000; // 超時策略: 30秒
$time_start = time();
$redis->rPush($tsk_name, $uuid); // 右(後)插入隊列
// 堵塞等待隊列中第一個和$uuid匹配的(到我了)
while($uuid != $redis->lGet($tsk_name, 0)){
if((time()-$time_start)> $time_out) {
break; // 超時跳出(某些原因隊列異常了, 可能永遠取不到)
}
usleep(10); // sleep 10ms, 再次嘗試
}
// 這里執行任務的處理代碼....
// $response 已拼裝好要返回的內容
// 處理完成後(資料庫等已入庫更新), 需要:
if($redis->lGet($tsk_name, 0) == $uuid){ // 再次確認第一個是本請求
$redis->lPop($tsk_name); // 完成任務了, 從隊列中移除
}else{
// 出現這種情況, 是因為超時了, 或前面的$uuid沒有被消費
// 若不清除, 後續的請求, 都將無法正常進入隊列執行
// 取隊列中的所有$uuid
$queues = $redis->lRange($tsk_name, 0, -1);
foreach($queues as $i=>$uid){
if($uid==$uuid){
㈣ php數組如何實現循環隊列
1.PHP基本上就是一種數組語言。時常要進行大量的數組循環操作,主要有兩種方式,
一種是foreach,另一種是while,
代碼如下:
foreach ($array as $value) {
echo $value;
}
while (list($key) = each($array)) {
echo $array[$key];
}
foreach ($array as $value) {
echo $value;
}
while (list($key) = each($array)) {
echo $array[$key];
}
2.在循環里進行的是數組「寫」操作,則while比foreach快:
foreach ($array as $key => $value) {
echo $array[$key] = $value . '...';
}
while (list($key) = each($array)) {
$array[$key] = $array[$key] . '...';
}
foreach ($array as $key => $value) {
echo $array[$key] = $value . '...';
}
while (list($key) = each($array)) {
$array[$key] = $array[$key] . '...';
}
㈤ php怎麼實現redis阻塞隊列
具體的業務還是得需要你自己定製。你的需求實際上是一個變形的生產者-消費者實現。對於此類需求,主要是將請求和實際的處理過程解耦,一般都是採取非同步的方式來通知請求方,這跟用不用redis其實沒有多大的關系。一般的實現方法是你需要將用戶的請求封裝成一個Task,然後將這個Task再push到redis隊列,然後後端的worker.php完全可以多進程、多線程的並發處理Task並將處理結果回調給請求方。這里唯一麻煩點的就是這個Task的設計,需要能夠包含請求信息(請求內容,請求方標識等等).
㈥ 如何使用php、html及消息隊列實現訂單超時自動關閉訂單
從php腳本方面解決的話,那就是每分鍾用ajax請求一次php腳本,檢查訂單狀態和當前時間,30分鍾後檢查到訂單無異,測php更新訂單到關閉狀態,這個地方需要用到setTimeout了,循環執行請求,但是缺點是頁面必能關閉,關閉了js就不執行,所以這個方法不太可取,30分鍾時間太長,不可能不進行其他頁面行為。
使用Mysql 定時計劃任務(推薦你使用),語法體
createeventmyevent
onscheleatcurrent_timestamp+interval1hour(周期或者時間點)
do
updatemyschema.mytablesetmycol=mycol+1;(執行的sql
詳細使用可以參考:https://segmentfault.com/a/1190000005142597,很清楚
㈦ 利用php +swoole如何實現非同步任務隊列
class msgServer
{
private $serv;
function __construct()
{
$this->serv = new SwooleServer("127.0.0.1", 9501);//創建一個服務
$this->serv->set(array('task_worker_num' => 4)); //配置task進程的數量
$this->serv->on('receive', array($this, 'onReceive'));//有數據進來的時候執行
$this->serv->on('task', array($this, 'onTask'));//有任務的時候執行
$this->serv->on('finish', array($this, 'onFinish'));//任務結束時執行
$this->serv->start();
}
public function onReceive($serv, $fd, $from_id, $data)
{
$data = json_decode($data, true);
$task_id = $serv->task($data);//這里發起了任務,於是上面的on('task', array($this, 'onTask'))就會執行
}
public function onTask($serv, $task_id, $from_id, $data)
{
$data['send_res'] = $this->sendMsg($data); //發送簡訊
//1.7.3之前,是$serv->finish("result");
return "result.";//這里告訴任務結束,於是上面的on('finish', array($this, 'onFinish'))就會執行
}
public function onFinish($serv, $task_id, $data)
{
$this->addSendLog($data); //添加簡訊發送記錄
}
}
㈧ PHP+MYSQL 實現隊列 進行發送簡訊怎麼做
最近遇到一個批量發送簡訊的需求,簡訊介面是第三方提供的。剛開始想到,獲取到手機號之後,循環調用介面發送不就可以了嗎?
但很快發現問題:當簡訊數量很大時,不僅耗時,而且成功率很低。
於是想到,用PHP和MySQL實現一個消息隊列,一條一條的發送簡訊。下面介紹具體的實現方法:
首先,建立一個數據表sms,包含以下欄位:
id,
phone, //手機號
content //簡訊內容
將需要發送的簡訊和手機號存入sms表中。
接下來,需要用PHP實現一個定時器,定時讀取一條記錄,並發送簡訊:
<?php
$db = new Db();
$sms = new Sms();
while(true){
$item = $db->getFirstRecord(); //獲取數據表第一條記錄
if(!$item){
//如果隊列中沒有數據,則結束定時器
break;
}
$res = $sms->send($item['phone'],$item['content']); //發送簡訊
if($res){
$db->deleteFristRecord(); //刪除發送成功的記錄
echo $item['phone'].'發送成功';
}else{
echo $item['phone'].'發送失敗,稍後繼續嘗試';
}
sleep(10); //每隔十秒循環一次
}
echo '發送完畢!';
?>
將代碼保存為timer_sms.php,打開命令行,執行定時器:
php timer_sms.php
好了,php定時器將會根據設定的時間間隔(這里設的是10秒),自動完成發送簡訊的任務。任務完成後將自動退出定時器,不再佔用伺服器資源。
根據我的測試,PHP定時器佔用資源並不多,不會對伺服器造成壓力。而且是非同步訪問資料庫,也不會影響資料庫的運行。
這種方式的優點是:
1、後台運行,前台無需等待
2、成功率高,失敗的記錄會自動重發,直到成功