使用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 相关文章推荐
PHP Smarty生成EXCEL文档的代码
Aug 23 PHP
php 过滤危险html代码
Jun 29 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
PHP中数组的分组排序实例
Jun 01 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
php实现转换ubb代码的方法
Jun 18 PHP
php中array_multisort对多维数组排序的方法
Jun 21 PHP
PHP邮件群发机实现代码
Feb 16 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
Sep 23 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
May 29 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
基于文本的留言簿
2006/10/09 PHP
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
广告切换效果(缓动切换)
2009/05/27 Javascript
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
js实现车辆管理系统
2020/08/26 Javascript
Python方法的延迟加载的示例代码
2017/12/18 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
年终总结会主持词
2014/03/25 职场文书
超市促销活动总结
2014/07/01 职场文书
小学教师师德整改措施
2014/09/29 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Python函数中apply、map、applymap的区别
2021/11/27 Python
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android