宝哥软件园

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

编辑:宝哥软件园 来源:互联网 时间:2021-09-01

业务需求

秩序是我们在日常发展中经常遇到的功能。最近做生意的时候,需要实现客户下单后不付款自动取消订单的功能。首先,我们确认了几种方法:

客户当时要求取消。服务器定期查询是否有要取消的订单,然后在批量下单后创建一个计时器,将其存储在redis或memcache中进行延迟处理,设置到期时间,并自动删除。综合考虑以上方法,先排除第一种,因为如果客户端禁止APP后台或网络连接,将无法向服务器发送请求,订单始终是未处理的;第二种方法使用次数较多,但存在准确性问题,需要确认预定任务的周期,暂列为补偿后方法;第四种方法的问题是,如果订单被删除,就会被物理删除,因此无法统计未处理的数据(当然,在保存redis时,可以将其存储在mysql这样的数据库中进行长期存储,然后通过第二种方法定期处理)。

最后,我们准备使用方法三。

要再次确认方法3的使用,由于开发语言PHP,需要使用Swoole或者workerman来实现定时器功能。Swoole是C开发的扩展框架,性能肯定更好,所以选择了Swoole。

初步准备

要使用swole,首先需要在服务器上安装swole扩展。安装方法类似于其他扩展。可以参考这里的文章,安装后检查扩展是否安装正常,检查phpinfo或者PHP-m,如果出现swole,说明安装成功。swole的官方文件中有计时器开始测试的相关文件

我们创建了一个swole _ test.php文件和一个log.txt文件(用于测试)。斯沃莱_ test.php代码如下:

?phpswoole_timer_after(3000,function(){ append _ log(time());3000毫秒后回声。 n ';});函数append _ log($ str){ $ dir=' log . txt ';$fh=fopen($dir,' a ');fwrite($fh,$str。 n ');fc lose(FH);}然后在网页上访问这个PHP文件,结果如下:

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

进去一会儿。

本来定时器只能在cli模式下,所以这个想法可能是GG,那么是不是栽在这里了?没有别的办法吗?就在我快要哭的时候,我突然恍然大悟,脑子里闪过一个词:Python!

是的,我们不能仅仅依靠PHP。还有一种像Python这样神奇的语言。我们知道操作系统。Python的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 install ln-s/usr/local/python 3/bin/python 3/usr/bin/python 3下一个终端输入:python 3,如果出现,

安装成功。

安装Python3后,我们将创建一个新的test.py文件,如下所示:

#!usr/bin/env python 3 `#-*-coding : uft-8-*-import OS ret=OS . system(/usr/local/PHP 7/bin/PHP/home/app/swole _ test . PHP ')#请使用自己系统的绝对路径print(ret)然后我们在终端执行:/usr/bin/python 3/home/app/test . py。注意:这里只执行PHP文件,文件中的回显内容不会在终端输出。此时,使用新创建的log.txt文件。执行完Python文件后,我们查看了日志文件,发现内容已经写好了,所以使用Python可以实现PHP的cli模式。| o ` |嗷~ ~

有些学生在这里会感到困惑。你已经用Python实现了PHP的cli模式,但是如何通过web远程访问呢?此时,使用PHP的exec方法。我们知道PHP的exec方法可以像Python的os.system方法一样执行命令行命令,因此我们可以创建一个新的test.php文件,其内容如下:

?PHP $ program='/usr/bin/python 3/home/app/nonyephp/test . py ';#注意使用绝对路径echo ' beginbr(exec($ program));echo“end br”;死去;然后我们通过网页访问test.php文件。结果如下:

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

我在这里感觉很开心,但总觉得哪里不对劲。我终于意识到一个很傻的问题:既然PHP可以直接拥有命令行函数,为什么还要费心去使用Python,然后再使用Python函数呢?这不是脱裤子放屁多此一举吗?

骂了自己n次白痴后,我默默修改了test.php文件的内容:

?phpecho ' beginbr$ program='/usr/local/PHP 7/bin/PHP/home/app/nongyephp/swoole _ test . PHP ';#注意使用绝对路径(exec($ program));echo“end br”;死去;直接访问test.php文件时,反馈结果和Python一样,可以省略Python,直接用PHP的exec函数执行PHP文件。

结局

通过测试后发现,这种方法可以创建定时器,并通过网络远程使用。但是,有一个问题。如果我们使用与我上面提到的相同的网页模拟,我们会发现网页刷新不会结束,直到test.php被执行。也就是说,如果我们将延迟时间设置为30分钟,我们将必须等待30分钟才会有反馈信息。这种方法肯定行不通,所以我们需要使用异步访问,比如使用web的ajax技术和其他异步技术,所以这里就不重复了。

尾巴

以上只是我解决问题的思路和实现步骤,但实际开发可能不会选择这种方法,因为没有性能测试,对流程控制和线程控制也没有太多深入的了解,所以以后会选择方法2自动取消订单。其实上面的方法完全可以省掉Python这一步。之所以没有改掉,是写出来自己的实现经验,因为我觉得在开发期间,可能真的会遇到这种多余的方式。简而言之,我需要思考更多,看看代码。找出可以优化的解决方案。我觉得我离这里很远。让我们分享一下。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

更多资讯
游戏推荐
更多+