PHP如何实现订单的延时处理详解

news2025/8/9 17:08:22

业务需求

订单是我们在日常开发中经常会遇到的一个功能,最近在做业务的时候需要实现客户下单之后订单超时未支付自动取消的功能,刚开始确认了几种方法:

  • 客户端到时间请求取消
  • 服务端定时查询有没有需要取消的订单,然后批量处理
  • 下单后创建定时器,延时处理
  • 使用redis或者memcache存储,设置过期时间,自动删除

综合考虑上述方法,第一种最先排除,因为如果客户把APP后台禁止或者网络连接禁止,那么就无法发给服务端请求,订单就会一直是未处理状态;第二种方法使用的比较多,不过存在准确度的问题,还有需要确认定时任务的周期,暂时列为后补方法;第四种方法存在的问题就是订单如果删除就是物理删除,无法统计未处理数据(当然可以存redis时候顺便存在mysql这样的数据库做长久存储然后用方法二定时处理)。

最终准备使用方法三。

再确认使用方法3的时候,由于使用的PHP这种开发语言,所以想实现定时器功能需要借助Swoole或者workerman。由于Swoole是C开发的扩展框架,性能方面肯定比较好,就选了Swoole。

前期准备

  • 使用Swoole首先需要在服务器上安装Swoole扩展,安装方法和安装其他扩展大同小异,可以参考这边文章
  • 安装完之后检测下扩展是否正常安装,查看phpinfo或者PHP-m,如果出现Swoole,则说明安装成功
  • Swoole官方文档有定时器的相关文档

开始测试

我们创建一个swoole_test.php文件和一个log.txt文件(用来测试),swoole_test.php代码如下:

1

2

3

4

5

6

7

8

9

10

11

<?php

swoole_timer_after(3000, function () {

 append_log(time());

 echo "after 3000ms.\n";

});

function append_log($str) {

 $dir = 'log.txt';

 $fh = fopen($dir, "a");

 fwrite($fh, $str."\n");

 fclose($fh);

}

然后在网页访问这个PHP文件,结果如下:

然后在Linux终端运行PHP:/usr/local/php7/bin/php /home/app/swoole_test.php,结果如下:

内心一阵。。。

原来定时器只能在cli模式下,那么这个想法怕是要GG了,难道就栽倒这里了吗,难道就没有别的方法了吗?就在我欲哭无泪的时候突然灵光乍现,一个词闪到我的脑海:Python!

对,我们不能单单靠着PHP啊,还有Python这种神奇的语言呢,我们知道Python的os模块里的os.system方法是可以执行命令行的,那么不就可以实现在cli模式下运行刚才的swoole_test.php文件了么。

内心一阵激动后,觉得测试是否可行

我们知道Linux都是自带Python的,但是不同的版本Python版本不同,有的自带的是Python2.6,版本过低了,所以需要装一个高版本的,这里我选择Python3,注意不要覆盖系统自带的Python2 。以下是大致的安装步骤:

  • wget http://python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
  • tar xf Python-3.6.0.tar.xz
  • cd Python-3.6.0
  • ./configure --prefix=/usr/local/python3
  • make && make install
  • ln -s /usr/local/python3/bin/python3 /usr/bin/python3

接下来终端输入:Python3,如果出现

则安装成功。

安装完Python3之后,我们新建一个test.py文件,内容如下:

1

2

3

4

5

#!usr/bin/env python3`

#-*- coding:utf-8 -*-

import os

ret = os.system("/usr/local/php7/bin/php /home/app/swoole_test.php") #请使用自己系统的绝对路径

print(ret)

然后我们在终端执行:/usr/bin/python3 /home/app/test.py,注意:这里只是执行PHP文件,但是文件里的echo内容是不会在终端输出的,这时候就用到刚才新建的log.txt文件了。执行完Python文件后,我们去log文件检查下,发现内容已经写入,所以使用Python是可以实现PHP的cli模式的。┗|`O′|┛ 嗷~~

到这里就会有同学疑惑了,你这使用Python实现了PHP的cli模式,但是怎么通过web远程访问呢?这个时候就用到PHP的exec方法了,我们知道PHP的exec方法和Python的os.system方法一样是可以执行命令行命令的,所以我们可以新建一个test.php文件,内容如下:

1

2

3

4

5

6

<?php

$program="/usr/bin/python3 /home/app/nongyephp/test.py"; #注意使用绝对路径

echo "begin<br>";

(exec ($program));

echo "end<br>";

die;

然后我们通过网页访问test.php文件。结果如下:

然后去log文件检查,发现也写入日志了,所以这个方法是可行的!

做到这里心里美滋滋的,不过老觉得好像哪里不对,终于终于意识到一个很傻逼的问题:既然PHP可以直接有命令行函数,为啥多此一举借助Python然后在用Python的函数呢?这不是脱了裤子放屁多此一举吗?

再大骂自己是傻逼N遍之后,我默默修改了test.php文件内容:

1

2

3

4

5

6

<?php

echo "begin<br>";

$program="/usr/local/php7/bin/php /home/app/nongyephp/swoole_test.php"; #注意使用绝对路径

(exec ($program));

echo "end<br>";

die;

在直接访问test.php文件,反馈结果和借助Python一样,这样就可以免去Python那一步,直接用PHP的exec函数来执行PHP文件。

结尾

测试通过后发现这种方法是可以创建定时器并且通过web远程使用的,不过有个问题,如果用和我上述一样用网页模拟会发现网页刷新是要等test.php执行完才会结束,也就是说如果我们把延时器的时间设成30分钟会要等待30分钟才会有反馈信息,这种方式肯定行不通的,所以需要使用异步访问,比如使用web的ajax技术和其他异步技术,这里不再赘述

尾巴

以上只是我想到解决问题的想法和实施步骤,到了真正开发可能不会选择这种方式,因为没有经过性能测试,而且对于进程控制和线程控制并没有多深入的了解,所以以后做订单自动取消还是会选择方法2的吧。
上述方法其实完全可以省掉Python那一步,我没有去掉的原因是把我的实现经历写出来,因为我觉得开发期间可能真的会遇到这种多此一举的方式,总之是要多思考,多看代码,找出能优化的方案,这里感觉自己差得很远,共勉吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习入门(五十)计算机视觉——转置卷积

深度学习入门&#xff08;五十&#xff09;计算机视觉——转置卷积前言计算机视觉——转置卷积课件&#xff08;初见转置卷积&#xff09;1 转置卷积2 为什么称之为“转置”课件&#xff08;再谈转置卷积&#xff09;1 转置卷积2 重新排列输入和核形状换算同反卷积的关系总结教…

Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

经典回答 这应该是一道很虐人的面试题&#xff0c;很多人都答不上来&#xff0c;很多人根本就没有用过。当我发现在被我面试的人中有80%的比例对它不了解时&#xff0c;我找过一些同事讨论是否还有在面试中考查这个问题的必要&#xff0c;得到的回答是“程序员何苦为难程序员”…

网络面试题总结

IO协议 问题一:如何理解IP的不可靠和无连接 不可靠:指的是不能保证数据包能成功地到达目的地。发生错误的时候,丢弃该数据包,发送ICMP消息给信源端。可靠性由上层提供。无连接: :IP 不维护关于后续数据报的状态信息。 体现在,IP 数据可以不按顺序发送和接收。A 发送连续…

信息安全工程实践笔记--Day2 暴力破解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录实验目标一、弱口令分类1.系统服务弱口令2.设备弱口令3.社工型的弱口令二、弱口令的攻击方式暴力破解获取密码的方式三、bp实操1.bp模块讲解1.sniper&#xff08;狙击…

跨平台下移动应用的开发框架对比与分析

当前由于移动互联网技术的日益发展&#xff0c;人们对移动互联网程序的要求也是越来越高&#xff0c;以往的互联网程序已经不能满足人们日益增长的需求&#xff0c;对此相关的工作技术人员要不断努力&#xff0c;研发出与时俱进的移动互联网程序。 近些年来由于平板电脑、智能…

【HTML5】调查问卷制作简约版

当你第一次使用CSS时候 目录 1、调查问卷网页展示及源码 1.1html源码 1.2css源码 2、form表单属性的用法 2.1date属性 2.2radio属性 2.3checkbox属性 2.4textarea标签 2.5required属性 2.6button标签 前言&#xff1a; 大家好&#xff0c;我是拳击哥带你捶键盘。首先感…

是前端受欢迎,不是你学了前端你就受欢迎好吧

☆ 这几天世界杯真是爆冷啊&#xff0c;也许是这届世界杯是冬天举办的原因吧。 ☆ 昨晚的德国对日本&#xff0c;日本做为亚洲小组冲出的第一名&#xff0c;实力强没有问题。而且我从小就看《足球小子》&#xff0c;大空翼深入人心啊。还记得那个动画片&#xff0c;放了学赶紧回…

运营版uniapp多商户商城小程序+H5+APP+商家入驻短视频社区种草直播阶梯拼团

运营版uniapp多商户商城小程序H5APP商家入驻短视频社区种草直播阶梯拼团 前后端全套源码&#xff0c; 支持二次开发&#xff0c;代码无加密&#xff01; 独立商家后台 用于店铺商品管理订单管理发货管理等 多类经营模式 多商家B2B2C、自营B2C运营模式 私有化部署 前端Uni…

Unity编辑器拓展最全实现

1编辑器顶部菜单学习 验证事项 2编辑器Scene菜单学习 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class TestSceneMenu : MonoBehaviour { [InitializeOnLoadMethod] //加入这个属性&#xff0c;就相当于…

7.前端笔记-CSS-元素显示模式

HTML元素分为块元素和行内元素两种类型 1、块元素 常见的块元素&#xff1a; <h1>~<h6> <p> <div> <ul> <ol> <li>块元素的特点&#xff1a; &#xff08;1&#xff09;独占一行 &#xff08;2&#xff09;高度、宽度、内外边距可…

java线程池详解

一 介绍 线程我们可以使用 new 的方式去创建&#xff0c;但如果并发的线程很多&#xff0c;每个线程执行的时间又不长&#xff0c;这样频繁的创建线程会大大的降低系统处理的效率&#xff0c;因为创建和销毁进程都需要消耗资源&#xff0c;线程池就是用来解决类似问题。 线程…

餐饮+KTV融合消费模式,会受消费者喜欢吗?

这个五一&#xff0c;我们雨科网门店系统的客户&#xff0c;大侠火锅店终于是将KTV搬到了自己的门店里&#xff0c;运用门店小程序功能及纸质代金券及礼品的噱头吸引客户进店&#xff0c;只需消费并和任意一人合唱一首歌即可领取&#xff0c;消费者在等餐或放松的时候一键点歌演…

一起来了解下 TOWER “未知装置”

从 2022 年 11 月 9 日开始&#xff0c;TOWER 未知装置可在 TOWER Token 网站&#xff08;https://www.crazydefenseheroes.com/fusion/game-assets&#xff09;上使用&#xff0c;允许玩家使用 TOWER Token 融合他们的 NFT 或将他们现有的 TOWER NFT 跟踪为不同的形式。 第一阶…

js - js中关于getBoundingClientRect()方法的使用

介绍一下getBoundingClientRect()方法的一些属性&#xff0c;以及具体的使用场景和一些需要注意的问题&#xff1b; 1&#xff0c;介绍 此方法返回元素的大小及其相对于视口的位置&#xff1b;返回的是一个对象&#xff1a; 包括 left、top、right、bottom、x、y、width 和 he…

ThinkPHP5目录结构

文章目录一、TP5的框架的下载1、[采用fastAdmin安装](https://www.fastadmin.net/download.html)2、Composer安装2.1 Composer提供的服务3、Git安装二、使用Composer安装后目录结构2.1 补充获取 Git 仓库git的工作机制一、TP5的框架的下载 1、采用fastAdmin安装 FastAdmin是一…

数据可视化大屏设计

在数据业务展示场景中&#xff0c;数据可视化大屏已经变得十分常见。那么在设计思路上&#xff0c;数据可视化大屏应当遵循什么样的设计逻辑&#xff1f;本篇文章里做了介绍&#xff0c;一起来看一下。 一、数据大屏的应用场景 1、大型会议 2、业务展示 二、数据大屏分类 1、展…

阿里云新用户滑块验证不过,阿里云滑动验证流程及线上问题排查

滑动验证是阿里巴巴集团提供的一种验证码解决方案&#xff0c;采用风险分析引擎&#xff0c;有效区分来自人类与机器人的访问行为并拦截机器风险&#xff0c;为您提供安全可靠的业务环境。 下图是滑动验证在用户客户端的展示效果。 产品介绍&#xff1a;阿里云验证码&#x…

5.XMLHttpRequest对象

XMLHttpRequest简称xhr&#xff0c;是浏览器提供的Javascript对象。之前我们使用的都是jQuery中的Ajax&#xff0c;现在我们使用原生JS的Ajax 目录 1 GET请求 1.1 不带参数请求 1.2 带参数请求 2 URL的编码与解码 2.1 编码 encodeURI() 2.2 解码 decodeURI() 3 …

计算机网络——TCP连接管理

本文将会介绍如何建立和拆除一条TCP连接&#xff0c;TCP的连接会显著的增加人们感受到的时延&#xff08;尤其是在Web冲浪时&#xff09;。同时一些常见的网络攻击SYN洪范攻击利用了TCP连接管理的弱点。 假定运行一台主机&#xff08;客户&#xff09;上的一个进程想和另一台主…

Spring中各种注解的使用说明汇总清单

目录 一、放在最开始方法的外侧的注解 1、ControllerAdvice&#xff1a; 2、ResponseBody 3、slf4j 4、Configuration 5、Component 6、Mapper 7、Service 8、RestController RequestMapping("/路径") 9、EnableTransactionManagement和Transactional&…