• 日产轩逸优惠2万元 置换补助4000 2019-11-28
  • 帅气小哥哥“勇闯”欧洲 一年为中国人省下几个亿 2019-11-28
  • 尽管过去计划经济时,由于局限性,工作上有过失误,有过短缺,但没有浪费。不存在笑博士说的做出来的东西无人用的问题。何况那时,主要还是通过人工作的计划。在今天,高科 2019-11-18
  • 紫光阁中共中央国家机关工作委员会 2019-10-25
  • 一朝春雷满地新绿 习近平最牵挂的绿色故事这样写就 2019-08-23
  • 泰达官方宣布国安飞翼加盟 他曾战恒大一场扬名 2019-08-08
  • 王式刚的专栏作者中国国家地理网 2019-08-02
  • 2018俄罗斯世界杯揭幕战看点全揭秘 2019-08-02
  • 當前位置:天津赖子麻将手机版-建站教程-網站開發-PHP教程-使用swoole 定時器變更超時未支付訂單狀態的解決方案

    免费广东红中赖子麻将:使用swoole 定時器變更超時未支付訂單狀態的解決方案

    文章TAG:定時器 訂單 swoole
    時間:2019-07-24來源/作者:he_xd 編輯:源碼庫 文章熱度:

    天津赖子麻将手机版 www.jiao120.com 如果對幾種方案沒有很好的想法,可以先看一下延伸閱讀里的其他方案,是一篇laravel china社區的討論

    借助 swoole 定時器和 redis 的 zset 來實現的定時檢查并過期未支付訂單

    起源于一個需求:將30分鐘內未支付的訂單過期處理成已失效狀態。

    最常規簡單的解決方案:在服務器上,跑一個定時任務,去數據表中查詢數據,查到未支付的訂單,update 一下這些數據的狀態,

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

    另一種方案: 存儲部分: 借助 redis 的 zset 有序集合,訂單產生的時候, zadd orders timestamp orderid 將 orderid 保存到對應的

    orders 集合中,以時間戳作為他的 score 分值,存儲部分是這樣的,簡單 + 占用空間內存極小。 讀取部分: 在 swoole 啟動時,設置定時器,每分鐘去 orders set 中讀取設置的時間之前的數據,個人為了測試方便,設置的讀取前一分鐘到前三十分鐘內的數據?;袢〉絞葜?,根據業務邏輯處理數據,然后 zrem orders orderid 命令從集合中移除對應的 orderid。 個人以為這個方案是內存占用和效率兼具的一個方案。 代碼如下:

    order.php

    <?php$server = new swoole_websocket_server("0.0.0.0", 9502);
    // 在定時器中使用協程需要增加此項配置
    $server->set(
      [
        'enable_coroutine' => true
      ]
    );
    $server->on('workerStart', function ($server, $workerId) {
      $redis = new Swoole\Coroutine\Redis();
      $redis->connect('127.0.0.1', 6379);
      // tick 為持續觸發的定時器
      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);
        // 根據查詢到的 id 進行業務處理,然后 zrem orders orderid 移除處理成功的 orderid 
      });
    });
    $server->on('message', function (swoole_websocket_server $server, $request) {
      $server->push($request->fd, "hello");
    });
    $server->start();

    測試過程: php order.php 開啟 swoole 監聽,然后新起終端,在 redis 的 orders 有序集合中不斷寫入新數據,效果如下圖:

    swoole,定時器,訂單

    延伸閱讀:

    1.swoole_timer_tick 文檔

    2.laravel china上的相關文章

    總結

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


    注:相關教程知識閱讀請移步到PHP教程頻道。
    相關PHP教程
    熱門標簽

    PHP教程Rss訂閱PHP教程搜索

  • 日产轩逸优惠2万元 置换补助4000 2019-11-28
  • 帅气小哥哥“勇闯”欧洲 一年为中国人省下几个亿 2019-11-28
  • 尽管过去计划经济时,由于局限性,工作上有过失误,有过短缺,但没有浪费。不存在笑博士说的做出来的东西无人用的问题。何况那时,主要还是通过人工作的计划。在今天,高科 2019-11-18
  • 紫光阁中共中央国家机关工作委员会 2019-10-25
  • 一朝春雷满地新绿 习近平最牵挂的绿色故事这样写就 2019-08-23
  • 泰达官方宣布国安飞翼加盟 他曾战恒大一场扬名 2019-08-08
  • 王式刚的专栏作者中国国家地理网 2019-08-02
  • 2018俄罗斯世界杯揭幕战看点全揭秘 2019-08-02
  • 越狱赚钱 郑州沐足男技师 手机看黄色片 做销售赚钱还是 什么是网络歌手如何赚钱 单双中特规律 韩国快乐8官网 电影版票投资赚钱吗 预测青海十一选五 河南22选5开奖结果查询204期 单机四人麻将 nba直播 腾讯体育 日本av视频 莱特币交易平台aqq 鲁抗医药股票分析 南京麻将算法图解