佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 使用swoole 定時(shí)器變更超時(shí)未支付訂單狀態(tài)的解決方案

使用swoole 定時(shí)器變更超時(shí)未支付訂單狀態(tài)的解決方案

熱門標(biāo)簽:團(tuán)購網(wǎng)站 銀行業(yè)務(wù) Mysql連接數(shù)設(shè)置 阿里云 服務(wù)器配置 科大訊飛語音識別系統(tǒng) Linux服務(wù)器 電子圍欄

如果對幾種方案沒有很好的想法,可以先看一下延伸閱讀里的其他方案,是一篇laravel china社區(qū)的討論

借助 swoole 定時(shí)器和 redis 的 zset 來實(shí)現(xiàn)的定時(shí)檢查并過期未支付訂單

起源于一個(gè)需求:將30分鐘內(nèi)未支付的訂單過期處理成已失效狀態(tài)。

最常規(guī)簡單的解決方案:在服務(wù)器上,跑一個(gè)定時(shí)任務(wù),去數(shù)據(jù)表中查詢數(shù)據(jù),查到未支付的訂單,update 一下這些數(shù)據(jù)的狀態(tài),

這些數(shù)據(jù)也可以存在在 redis 中,大致操作都是這樣的。數(shù)據(jù)量少,服務(wù)器沒有很多壓力的時(shí)候,這幾種方案不會突出優(yōu)劣,想用哪個(gè)用哪個(gè)。

另一種方案: 存儲部分: 借助 redis 的 zset 有序集合,訂單產(chǎn)生的時(shí)候, zadd orders timestamp orderid 將 orderid 保存到對應(yīng)的

orders 集合中,以時(shí)間戳作為他的 score 分值,存儲部分是這樣的,簡單 + 占用空間內(nèi)存極小。 讀取部分: 在 swoole 啟動(dòng)時(shí),設(shè)置定時(shí)器,每分鐘去 orders set 中讀取設(shè)置的時(shí)間之前的數(shù)據(jù),個(gè)人為了測試方便,設(shè)置的讀取前一分鐘到前三十分鐘內(nèi)的數(shù)據(jù)。獲取到數(shù)據(jù)之后,根據(jù)業(yè)務(wù)邏輯處理數(shù)據(jù),然后 zrem orders orderid 命令從集合中移除對應(yīng)的 orderid。 個(gè)人以為這個(gè)方案是內(nèi)存占用和效率兼具的一個(gè)方案。 代碼如下:

order.php

?php$server = new swoole_websocket_server("0.0.0.0", 9502);
// 在定時(shí)器中使用協(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ā)的定時(shí)器
  swoole_timer_tick(10000, function() use ($redis) {
    $upperLimitTime = strtotime('-1 minute');
    $lowerLimitTime = strtotime('-30 minute');
    echo '上限時(shí)間:' . $upperLimitTime . '下限時(shí)間:' . $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ù),效果如下圖:

延伸閱讀:

1.swoole_timer_tick 文檔

2.laravel china上的相關(guān)文章

總結(jié)

以上所述是小編給大家介紹的使用swoole 定時(shí)器變更超時(shí)未支付訂單狀態(tài)的解決方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • PHP框架Swoole定時(shí)器Timer特性分析
  • vue仿淘寶訂單狀態(tài)的tab切換效果

標(biāo)簽:江蘇 廣元 蚌埠 衢州 萍鄉(xiāng) 衡水 棗莊 大理

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用swoole 定時(shí)器變更超時(shí)未支付訂單狀態(tài)的解決方案》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    洪洞县| 衡东县| 乌恰县| 崇义县| 桑植县| 股票| 黄石市| 冀州市| 堆龙德庆县| 无极县| 谢通门县| 长宁县| 湖口县| 崇仁县| 新民市| 吴川市| 河池市| 军事| 尖扎县| 龙岩市| 桂东县| 壤塘县| 长垣县| 德安县| 沙河市| 宽城| 雷波县| 湘潭市| 寻乌县| 和静县| 绥宁县| 本溪市| 郓城县| 崇礼县| 德钦县| 台江县| 邯郸县| 长沙县| 循化| 鸡西市| 两当县|