使用swoole 定时器变更超时未支付订单状态的解决方案


Posted in PHP onJuly 24, 2019

如果对几种方案没有很好的想法,可以先看一下延伸阅读里的其他方案,是一篇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 定时器变更超时未支付订单状态的解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

PHP 相关文章推荐
APMServ使用说明
Oct 23 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 PHP
php断点续传之如何分割合并文件
Mar 22 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
php实现简单的语法高亮函数实例分析
Apr 27 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
php字符串操作常见问题小结
Oct 11 PHP
CI框架常用函数封装实例
Nov 21 PHP
PHP对象、模式与实践之高级特性分析
Dec 08 PHP
php使用curl代理实现抓取数据的方法
Feb 03 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
Laravel 5+ .env环境配置文件详解
Apr 06 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 #PHP
Thinkphp5 自定义上传文件名的实现方法
Jul 23 #PHP
PHP中__set()实例用法和基础讲解
Jul 23 #PHP
PHP大文件分块上传功能实例详解
Jul 22 #PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 #PHP
php多进程应用场景实例详解
Jul 22 #PHP
PHP实现的多进程控制demo示例
Jul 22 #PHP
You might like
PHP中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
随机广告显示(PHP函数)
2006/10/09 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
微信小程序 转发功能的实现
2017/08/04 Javascript
Vue.js用法详解
2017/11/13 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
vue实现标签云效果的示例
2020/11/09 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
python批量赋值操作实例
2018/10/22 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
python计算无向图节点度的实例代码
2019/11/22 Python
Python3自定义json逐层解析器代码
2020/05/11 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
python 制作简单的音乐播放器
2020/11/25 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
汽车驾驶求职信
2013/10/25 职场文书
运动会广播稿100字
2014/01/11 职场文书
便利店的创业计划书
2014/01/15 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
先进班集体申报材料
2014/12/26 职场文书
自荐信怎么写
2015/03/04 职场文书
给校长的建议书范文
2015/09/14 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
品德与社会教学反思
2016/02/24 职场文书