PHP定时通知、按时发布怎么做?

需求/场景:

  1. 比如设置一篇文章2018-5-22 13:51:16发布。

  2. 三天后通知我。

  3. 消息过期后自动删除。

……

等等这种需求,就是自动到了一个时间点就做某事,这个跟队列好像没什么关系感觉,是不是要什么中间件之类的时间,或是常驻进程之类的。

我的理解是,把待做的任务一行一行的放到一个表里面,然后一个进程不断的去刷,满足时间节点的任务就拿出来执行,是这样的思路吗。

想知道这种场景成熟的解决方案是用什么做的?

谢谢^_^

补充:

这个问题也和这个问题有关联 究竟能不能用死循环?或者其实我们就活在一个死循环的世界中?

阅读 13.1k
14 个回答

楼主要的应该是DelayQueue,即延迟消息队列服务。具体场景可以参考:
1.淘宝的自动取消订单业务
2.饿了么下单短信通知业务等等。
基于wait/notify的方式把Timer实现。

WordPress定时发布文章这个功能是通过用户访问来触发的.
也就是如果没有用户访问,那WordPress是不会发布文章的.
一旦用户访问,WordPress就会查询是否有需要发布的文章,有则发布.

如果你要追求准时发布,那还是用Linux crontab定时任务吧:

sudo nano /etc/crontab 添加一条任务:
格式: m h dom mon dow command
即: 分(0~59) 时(0~23) 日(1~31) 月(1~12) 周(0~6,0为周日) 命令
例如: 0 */1 * * * /usr/bin/php /path/to/task.php
表示每隔1小时自动执行脚本task.php.

重载服务使配置生效:
sudo service cron reload

就是用程序不断去刷的= =

可以使用crontab定时任务来解决,可以来设计每天、小时、分调用Php接口。

加个时间字段,然后在模型层做相关判断

程序刷,但是要考虑数据库压力。
可以把任务都压到队列去,脚本死循环从队列拿出来,比较时间点,到了就把任务丢给执行模块。时间点没到的就继续另一边压入队列中。

两个队列。比如 待执行队列:tastList; 立即执行队列:runList。
把取任务和执行任务分不同进程:
1、取任务:脚本循环从tastList中pop任务,判断时间点,到点了把这个任务push到runList队列中去。不到点的继续压入到tastList中去;
2、执行任务:循环冲runList中去pop,一有任务就马上执行。

量大的时候,自己根据需要去到开几个进程就了,也不用考虑说会重复执行。

用系统的定时任务功能触发一个脚本就行了。具体脚本干什么,怎么干可以自己随便啦,参考上面的回答也可以。
一般来说一个高频脚本就够了(比如1分钟一次或者5分钟一次),脚本内再去判断时间然后调用不同频率的任务,这样比每种频率的脚本分别建立定时任务好管理的多。

websocket 

或者用workerman swoole定时任务功能

就是你把数据存起来,然后弄个脚本一直去检测。。比如1分钟检测一次

可以在linux下设置个计划任务,每隔一个时间去执行你的php代码,将你要执行的php代码封装好,然后在linux直接设置crontab就行了

没这么麻烦吧:
1,这个发布也就是显示的意思,判定当前时间是否大于发布时间,大于就显示。
2,文章表增加一个是否已发送通知成功的字段,然后用windows计划任务或者Linux crontab来执行每隔一段时间监测当前时间大于发布时间且未发送通知的文章,来发送通知。
3,自动删除没明白是删除什么,但是应该和2类似吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题