真没想到我这么水的文章居然还有可爱的小伙伴来看,非常感谢。其实这篇文章是我在元旦假期的最后一天无所事事的时候无意中想到的一个场景,然后努力去实现。其实网上有很多学习自动取消订单功能的方法,包括评论区的小伙伴们。我们提到的定时任务和消息队列只是我想到的一种方法(我承认我真的很水)。感谢评论区的朋友们的热心建议和教导。我也会在您的指导下学习,继续学习。再次感谢~?(′???`)以下为原文:最近业务需要在做业务的时候,需要实现客户下单后未支付的订单自动取消的功能。一开始确定了几种方法:客户端到时候要求取消,服务器定时检查是否有需要取消的订单,然后批量处理下单。然后创建定时器,使用redis或者memcache进行延时处理,设置过期时间,自动删除。综合以上几种方式,首先排除第一种方式,因为如果客户禁用了APP后台或者网络连接,那么就无法向服务端发送请求,订单将一直处于未处理状态;第二种方法使用较多,但存在精度问题,需要确认定时任务的周期,暂列为后续方法;第四种方法存在的问题是,如果删除订单,会物理删除,无法统计未处理的数据(当然可以在redis存储的时候存储到mysql等数据库中长期存储,然后通过方法2)进行定期处理。终于准备使用方法三了。确认使用方法三时,由于使用的是PHP开发语言,所以需要Swoole或者workerman来实现定时器功能。由于Swoole是C开发的扩展框架,性能肯定更好,所以选择了Swoole。前期准备使用Swoole,首先需要在服务器上安装Swoole扩展。安装方法与安装其他扩展类似。可以参考这里的文章检查扩展是否正常安装。检查phpinfo或PHP-m。如果出现Swoole,说明安装成功Swoole官方文档有timer相关文档可以开始测试。我们创建一个swoole_test.php文件和一个log.txt文件(用于测试)。swoole_test.php代码如下:";(exec($program));echo"end
";死;然后我们通过网页访问test.php文件。结果如下:然后去日志文件查看,发现也写入了日志,所以这个方法是可行的!我很高兴这样做,但我总觉得不对劲,终于意识到了一个很愚蠢的问题:既然PHP可以直接有命令行功能,为什么还要用Python,然后再用Python函数呢?脱裤子放屁不是多此一举吗?骂自己N次傻子后,默默修改了test.php文件的内容:";$program="/usr/local/php7/bin/php/home/app/nongyephp/swoole_test.php";#注意使用绝对路径(exec($program));echo"end
";die;直接访问test.php文件时,反馈的结果和使用Python是一样的,这样就可以省去Python那一步,直接使用PHP的exec函数来执行PHP文件。最后测试通过后,发现这个方法可以创建定时器,通过web远程使用,但是有个问题。如果你使用我上面提到的网页模拟,你会发现直到执行了test.php,网页刷新才会结束。也就是说,如果我们设置延迟时间为30分钟,那么我们需要等待30分钟才会有反馈信息。这种方法肯定行不通,所以我们需要使用异步访问,比如使用webajax技术等异步技术,这里尾巴就不赘述了。以上只是我解决问题的思路和实现步骤。真正开发的时候,我可能不会选择这种方式,因为它没有通过性能测试,而且我对进程控制和线程控制也没有太多深入的了解,所以以后如果想自动取消订单,你还是会选择方法2。其实上面的方法完全可以省去Python的步骤。之所以没有去掉,是想写下自己的实现经验,因为我觉得在开发期间,可能真的会遇到这种多余的方法。总之,需要多思考,多看代码,找到可以优化的解决方案,这里感觉自己差的很远,大家互相鼓励
