使用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学习之PHP变量
Oct 09 PHP
PHP警告Cannot use a scalar value as an array的解决方法
Jan 11 PHP
二招解决php乱码问题
Mar 25 PHP
PHP资源管理框架Assetic简介
Jun 12 PHP
PHP抓取网页、解析HTML常用的方法总结
Jul 01 PHP
ThinkPHP模型详解
Jul 27 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
PHP中substr函数字符串截取用法分析
Jan 07 PHP
thinkPHP微信分享接口JSSDK用法实例
Jul 07 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
PHP使用phpunit进行单元测试示例
Sep 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中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
微信支付扫码支付php版
2016/07/22 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
JavaScript Split()方法
2015/12/18 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
跟老齐学Python之关于类的初步认识
2014/10/11 Python
详细解析Python当中的数据类型和变量
2015/04/25 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
Django 实现下载文件功能的示例
2018/03/06 Python
Python实现最大子序和的方法示例
2019/07/05 Python
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
上班睡觉检讨书
2014/01/09 职场文书
简历里的自我评价
2014/01/31 职场文书
致200米运动员广播稿
2014/02/06 职场文书
2014春晚主持词
2014/03/25 职场文书
一分钟演讲稿
2014/04/30 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
MyBatis 动态SQL全面详解
2021/10/05 MySQL