使用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初学者头疼问题总结
Jul 08 PHP
PHP include_path设置技巧分享
Jul 03 PHP
php自定义函数call_user_func和call_user_func_array详解
Jul 14 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
PHP代码审核的详细介绍
Jun 13 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
PHP微框架Dispatch简介
Jun 12 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
基于PHPexecl类生成复杂的报表表头示例
Oct 14 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 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 file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
2008/09/26 Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
python中map、any、all函数用法分析
2015/04/21 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
django定期执行任务(实例讲解)
2017/11/03 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
python随机模块random使用方法详解
2020/02/14 Python
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
学年自我鉴定范文
2013/10/01 职场文书
中专毕业生自荐信
2013/11/16 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
学习型党组织心得体会
2014/09/12 职场文书
小时代观后感
2015/06/10 职场文书
董事长秘书工作总结
2015/08/14 职场文书
初中政治教学反思
2016/02/23 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB