使用swoole 定時器變更超時未支付訂單狀態(tài)的解決方案
如果對幾種方案沒有很好的想法,可以先看一下延伸閱讀里的其他方案,是一篇laravel china社區(qū)的討論
借助 swoole 定時器和 redis 的 zset 來實(shí)現(xiàn)的定時檢查并過期未支付訂單
起源于一個需求:將30分鐘內(nèi)未支付的訂單過期處理成已失效狀態(tài)。
最常規(guī)簡單的解決方案:在服務(wù)器上,跑一個定時任務(wù),去數(shù)據(jù)表中查詢數(shù)據(jù),查到未支付的訂單,update 一下這些數(shù)據(jù)的狀態(tài),
這些數(shù)據(jù)也可以存在在 redis 中,大致操作都是這樣的。數(shù)據(jù)量少,服務(wù)器沒有很多壓力的時候,這幾種方案不會突出優(yōu)劣,想用哪個用哪個。
另一種方案: 存儲部分: 借助 redis 的 zset 有序集合,訂單產(chǎn)生的時候, zadd orders timestamp orderid 將 orderid 保存到對應(yīng)的
orders 集合中,以時間戳作為他的 score 分值,存儲部分是這樣的,簡單 + 占用空間內(nèi)存極小。 讀取部分: 在 swoole 啟動時,設(shè)置定時器,每分鐘去 orders set 中讀取設(shè)置的時間之前的數(shù)據(jù),個人為了測試方便,設(shè)置的讀取前一分鐘到前三十分鐘內(nèi)的數(shù)據(jù)。獲取到數(shù)據(jù)之后,根據(jù)業(yè)務(wù)邏輯處理數(shù)據(jù),然后 zrem orders orderid 命令從集合中移除對應(yīng)的 orderid。 個人以為這個方案是內(nèi)存占用和效率兼具的一個方案。 代碼如下:
order.php
<?php$server = new swoole_websocket_server("0.0.0.0", 9502);
// 在定時器中使用協(xié)程需要增加此項(xiàng)配置
$server->set(
[
'enable_coroutine' => true
]
);
$server->on('workerStart', function ($server, $workerId) {
$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1', 6379);
// tick 為持續(xù)觸發(fā)的定時器
swoole_timer_tick(10000, function() use ($redis) {
$upperLimitTime = strtotime('-1 minute');
$lowerLimitTime = strtotime('-30 minute');
echo '上限時間:' . $upperLimitTime . '下限時間:' . $lowerLimitTime;
$result = $redis->zrangebyscore('orders', $lowerLimitTime, $upperLimitTime);
var_dump($result);
// 根據(jù)查詢到的 id 進(jìn)行業(yè)務(wù)處理,然后 zrem orders orderid 移除處理成功的 orderid
});
});
$server->on('message', function (swoole_websocket_server $server, $request) {
$server->push($request->fd, "hello");
});
$server->start();
測試過程: php order.php 開啟 swoole 監(jiān)聽,然后新起終端,在 redis 的 orders 有序集合中不斷寫入新數(shù)據(jù),效果如下圖:

延伸閱讀:
總結(jié)
以上所述是小編給大家介紹的使用swoole 定時器變更超時未支付訂單狀態(tài)的解決方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
php筆記之:php函數(shù)range() round()和list()的使用說明
本篇文章介紹了,php函數(shù)range() round()和list()的使用說明。需要的朋友參考下2013-04-04
Thinkphp3.2實(shí)用篇之計(jì)算型驗(yàn)證碼示例
本篇文章主要介紹了Thinkphp3.2實(shí)用篇之計(jì)算型驗(yàn)證碼示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
PHP數(shù)字和字符串ID互轉(zhuǎn)函數(shù)(類似優(yōu)酷ID)
這篇文章主要介紹了PHP數(shù)字和字符串ID互轉(zhuǎn)函數(shù),生成的字符串ID類似優(yōu)酷的視頻ID,像一個加密過的數(shù)字ID,本文函數(shù)可以在數(shù)字ID和字符串ID間相互轉(zhuǎn)換,需要的朋友可以參考下2014-06-06
如何解決phpmyadmin導(dǎo)入數(shù)據(jù)庫文件最大限制2048KB
這篇文章主要介紹了如何解決phpmyadmin導(dǎo)入數(shù)據(jù)庫文件最大限制2048KB的相關(guān)資料,需要的朋友可以參考下2015-10-10
LAMP環(huán)境使用Composer安裝Laravel的方法
這篇文章主要介紹了LAMP環(huán)境使用Composer安裝Laravel的方法,簡單分析了Ubuntu服務(wù)器環(huán)境下Composer的安裝及使用Composer安裝Laravel的相關(guān)命令與使用技巧,需要的朋友可以參考下2017-03-03

