一般php开发中常用的定时任务是如何实现的?例如用户下单时间密度比较高(假如每秒都有下单),自动关闭订单需要退款或者其他附加操作,这时使用crontab定时任务还合适吗?没怎么接触过消息队列消息队列可以实现吗?

就像@浪奥布杰克特 提出的 任务是用户自定义的,用户在web界面进行配置,现在的系统是php写的,任务是一个定时推送的功能,比如用户A关注a话题,他要每天早上9点收到a话题的相关推送,用户B关注b话题,他要每天夜里8:00收到b话题的相关推送。 用户对于他自己的任务可以增删改查。 用户的数量未知,假设有100人,如果使用crontab的话,推送工能可以用php脚本实现在命令行下执行。 问题是,用户在web界面发起http的配置请求,后台如何修改crontab的配置文件,如果把crontab的配置文件许可权给到777,php调用本地shell去修改,但是crontab区分操作系统用户的,不同系统用户对应不同的配置文件,伺服器以root用户运行,是不是每个人都要修改root的crontab的配置呢? 还有,crontab的每个任务都要带上用户的标识,以便用户来查找更新他自己的任务。100个人就会有100个任务,如果用户越来越多,crontab最多可以运行多少定时任务 作者:浪奥布杰克特 链接:https://www.zhihu.com/question/36359140/answer/67183039 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

若用户量越来越大是否是每个用户都要独立操作crontab

我目前想到关于订单自动关单的解决方案就是被动执行(用户访问相应页面时进行订单超时检测) + crontab(每隔x小时进行订单检测定时任务),但是如果用户需要定时推送或者其他的定时执行操作这个貌似就不是很灵光了。。

或者说php无法解决这个问题的情况下需要借助其他框架/语言来实现吗?


可以考虑在插入新订单时,触发定时清理操作.具体就是读取上次订单清理时间,然后跟当前系统时间对比,如果超过定时清理的时长(比如30分钟),就执行清理操作,删除掉订单表中过期的订单.

对于这些配置数据,可以保存在系统的配置表里,比如:

conf(conf_name, conf_value)

order_last_clean_time: 1493101925 (上次订单清理时间)

order_cron_clean_time: 30分钟 (定时清理的时长)

order_expire_time: 30分钟 (超过30分钟未付款的订单视为过期)


1. 订单半小时未支付自动关闭等需求,用延时任务, 效率高, 只访问资料库一次。定时任务要不断地去扫描是否有需要关闭的订单。

2. 用户定时任务, 不适合放到crontab, 管理维护太麻烦。

定时任务管理 ouqiang/gocron

延迟队列 https://github.com/ouqiang/delay-queue

不要总想什么解决方案都用PHP来实现

个人提供3种方案

1:任务调度服务,加入自动执行代码来检查订单是否过期,如果过期取消;

2;linux计划任务:执行php脚本执行。原理同上

3; mysql 资料库 event 事件,每一条订单添加一个监听事件,如果支付完成事件取消。如果没支付;按照约定的事件执行事件,取消订单;


题主问题问的不具体。

基本来说,各种办法都可以,包括题目描述中说的。

消息队列比定时任务更好,但定时任务更简单一些。

用redis可以简单实现消息队列,或用专门的软体,在linux中有无数办法可以实现队列。

然后一个固定的不停止的php后台进程,去访问消息队列,即可。中间的处理过程都要保存在资料库里。


就像@浪奥布杰克特 提出的
任务是用户自定义的,用户在web界面进行配置,现在的系统是php写的,任务是一个定时推送的功能,比如用户A关注a话题,他要每天早上9点收到a话题的相关推送,用户B关注b话题,他要每天夜里8:00收到b话题的相关推送。
用户对于他自己的任务可以增删改查。
用户的数量未知,假设有100人,如果使用crontab的话,推送工能可以用php脚本实现在命令行下执行。
问题是,用户在web界面发起http的配置请求,后台如何修改crontab的配置文件,如果把crontab的配置文件许可权给到777,php调用本地shell去修改,但是crontab区分操作系统用户的,不同系统用户对应不同的配置文件,伺服器以root用户运行,是不是每个人都要修改root的crontab的配置呢?
还有,crontab的每个任务都要带上用户的标识,以便用户来查找更新他自己的任务。100个人就会有100个任务,如果用户越来越多,crontab最多可以运行多少定时任务

作者:浪奥布杰克特
链接:https://www.zhihu.com/question/36359140/answer/67183039
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

若用户量越来越大是否是每个用户都要独立操作crontab

我目前想到关于订单自动关单的解决方案就是被动执行(用户访问相应页面时进行订单超时检测) + crontab(每隔x小时进行订单检测定时任务),但是如果用户需要定时推送或者其他的定时执行操作这个貌似就不是很灵光了。。

或者说php无法解决这个问题的情况下需要借助其他框架/语言来实现吗?


linux上的话crontab,windows计划任务,PHP实现使用计时器


推荐阅读:
相关文章