使用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实现文件上传二法
Oct 09 PHP
php adodb连接mssql解决乱码问题
Jun 12 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
php实现事件监听与触发的方法
Nov 21 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
PHP curl使用实例
Jul 02 PHP
常见PHP数据库解决方案分析介绍
Sep 24 PHP
yii实现使用CUploadedFile上传文件的方法
Dec 28 PHP
php中namespace use用法实例分析
Jan 22 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 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输出数组中重名的元素的几种处理方法
2012/09/05 PHP
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
Python闭包思想与用法浅析
2018/12/27 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
python爬虫容易学吗
2020/06/02 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
财务会计专业毕业生自荐信
2013/10/02 职场文书
专科文秘应届生求职信
2013/11/18 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
2014年端午节活动方案
2014/03/11 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
志愿者个人总结
2015/03/03 职场文书
大学生个人简历自我评价
2015/03/11 职场文书