使用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 相关文章推荐
apache2.2.4+mysql5.0.77+php5.2.8安装精简
Apr 29 PHP
PHP 解决utf-8和gb2312编码转换问题
Mar 18 PHP
PHP 类相关函数的使用详解
May 10 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
yii2分页之实现跳转到具体某页的实例代码
Jun 02 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
php基于SQLite实现的分页功能示例
Jun 21 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
Feb 27 PHP
PHP优化之批量操作MySQL实例分析
Apr 23 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者的疑难问答(2)
2006/10/09 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
Python常用的日期时间处理方法示例
2015/02/08 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
TensorFlow实现模型评估
2018/09/07 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
Python装饰器语法糖
2019/01/02 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
心理学专业求职信
2014/06/16 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python