我正在为我的公司开发一个工具,如果他们决定在网上通知时,它会向用户发送一些信息(图片链接)。
如果它只是提醒他们什么时候上网很容易,因为你不必安排它,只需检查一下列表,看看是否有人想要在网上联系时收到关于该图片的消息,并且这样做。
但我们也有“我们已经收到您的请愿书了,图片还没有到这里,但是当它是”有点消息时,我们会给你发消息,还有一些“尚未在这里”,如果图片我必须在几天之后推出还没有上线。如果在任何时候图片上线,所有这些预定的工作都需要取消,我们会发送带有链接的消息。
我会尝试尽可能详细地解释它:
在任何给定的时间内,即使在第5点之后,如果图片在线,我们想要取消所有这些时间表并发送带有图片的消息。
我一直在努力学习如何做到这一点,通过我的搜索我已经了解了实现此功能的三种可能方法:
选项A:每分钟执行一次Cronjob,扫描数据库表,搜索是否有时间发送其中一条消息。
这个选项很容易理解,虽然我担心它可能会对数据库征税过多。我可以使用1和1设置单个Cronjob的shifty控制面板并将其称为一天。
选项B:以编程方式为每个已安排的消息编写Cronjobs。
这听起来像是更“高效”,或者至少对数据库不那么费力,但我不确定Cronjob应该像那样工作。它通常用于安排重复自己的任务,不是吗?这需要很多功能才能工作(读取Crontab,添加一行,搜索一行,编辑一行,删除一行)。问题在这里我不知道如何通过php编辑1and1服务器上的crontab。我试图联系他们,但他们的支持根本没有帮助。
选项C:linux中的“at”函数。 This我刚学会了。看起来它会做我想做的事情:安排一次只发生一次的任务,它的结构似乎很容易处理。这里的问题有三个:1-我不知道PHP是否可以执行命令行,2-我不知道1and1上的服务器是否安装了“at”程序,3-我不知道我是否可以获取一个命令行来执行带有参数的PHP文件以使其工作。如果可以做到这些,我不知道如何做。
如你所见,有许多我不知道的事情,但我一直在努力告知自己并学习。我只是在这里问,因为我在绳子的尽头。
我列出的这些选项并不是一个详尽的列表,它们只是我发现的方法。
哪种方法更适合我的目的?怎么做?
相关事实:
以编程方式为每个已安排的消息编写Cron Jobs。
上帝不,你将遇到的最大问题是,你必须提前预测你必须发送什么类型的消息,这与你轻松取消消息的能力发生冲突。你通常不得不担心要处理很多状态(稍后会详细介绍),这很麻烦。您还需要确保之后再次清理您的预定作业,因为cron
只能设置重复任务。
linux中的“at”函数。
这基本上是cron
但是对于非重复的任务。那更好,但仍然是有状态的。特别是对于共享主机,无论您的代码是始终在同一台计算机上执行还是计算机可能重新启动,您都有些无法预测。在这种情况下,您可能会失去预定的工作,所以这是不行的。
每分钟执行一次Cronjob,扫描数据库表,搜索是否有时间发送其中一条消息。
是的,这是做到这一点的方法。这里最大的优点是它是无状态的,从某种意义上说它总是能够获取数据库的当前内容,因此它可以让你轻松管理你的工作在下次运行时应该做什么而不必预测在您安排活动时。
我担心这可能会对数据库造成太大的负担。
这是每分钟一次查询(如果写得好)。据推测,您网站的每个页面加载都会产生一个或多个查询,而正确构建的网站应该能够每秒处理数百到数千个加载。每分钟还有一个查询不打算tank。如果是这样,那么你就会遇到更大问题。
我个人会选择A,我已经在我工作的项目上使用它了。在你的情况下,将数据放在共享主机上,我会创建一个每分钟运行一次的cronjob(使用online service)并在文件夹中的某个位置点击php文件,检查数据库表是否必须执行任何操作。您应该编写一些代码来处理您要发送的所有通知,以及何时为每个通知创建db表中的一行,其中包含执行时间以及准备用于创建通知和发送的所有详细信息出来。
整个过程会或多或少地起作用如下: - 发生的事情需要创建一个在5分钟内发送的通知:行在db表中创建,其中unix时间或日期为5分钟。 - 通知需要在3天后发出,您使用与上述相同的程序。
cronjob每分钟运行一次并检查过期的订单(任何日期<= now),如果有的话,脚本会处理这些行并执行订单(仅发送所需的通知)。
数据库不会受到太多打扰,每分钟只需执行1次查询(仅检查过期订单)。