如何安排在Linux共享服务器上发送的不同消息

时间:2018-08-31 09:45:26

标签: php cron scheduled-tasks

我正在为我的公司开发一个工具,该工具的用途很广泛,旨在向用户发送一些信息(指向图片的链接),如果他们决定要在发布时得到通知。

如果它只是在提醒他们何时在线很容易,因为您不必安排它,只需检查列表以查看是否有人希望在图片在线时收到有关该图片的消息,然后执行。 / p>

但是我们也有“我们已经收到您的请愿书,图片还没有在这里,但是如果有,我们会给您发送消息”,还有一些我几天后必须启动的“不在这里”消息如果图片尚未在线。如果图片在任何时候联机,所有这些计划的作业都需要取消,我们将通过其链接发送消息。

我将尽我所能详细解释它:

  1. 用户要求收到通知
  2. 我们的网站记录了请愿书。 (将其添加到数据库中)
  3. 检查文件是否已经联机。目前,该文件可能尚未上传,但可能只有几秒钟的路程。因此,如果在申请时该图片尚未在线,我们想等待1-2分钟,以发送“此处图片尚未到位”消息。只是为了避免发送“不在这里”消息,而是在5秒钟后发送“您的图片在这里”消息。
  4. 我们要等待几个小时(1-3),以发送新消息要求他们耐心等待。
  5. 在又设定的时间(大约7天)之后,我们要发送最后一条消息,让他们知道图片可能因为未上传而永远无法到达。

在任何给定时间内,即使在第5点之后,如果图片在线,我们也要取消所有这些时间表,并随图片一起发送消息。

我一直在尝试学习如何做到这一点,并且通过搜索,我了解了实现此功能的三种可能方法:

选项A:每分钟执行一次Cronjob,以清除是否需要发送这些消息之一的数据库表搜索。

此选项很容易理解,尽管我担心它可能会使数据库负担过多。我可以使用1and1必须设置的可变控制面板来设置单个Cronjob并将其命名为一天。

选项B:以编程方式为预定的每条消息编写Cronjobs。

这听起来可能会更“有效”,或者至少减少数据库的负担,但是我不确定Cronjob是否应该那样工作。通常用于安排重复执行的任务,不是吗?这将需要大量功能才能工作(阅读Crontab,添加一行,搜索一行,编辑一行,删除一行)。问题出在这里,我不知道如何通过php编辑1and1服务器上的crontab。我试图与他们联系,但他们的支持根本没有帮助。

选项C::Linux中的“ at”功能。 This我刚刚了解到。看起来它可以满足我的要求:安排仅执行一次的任务,并且它的结构似乎很容易处理。这里的问题有三个方面:1-我不知道PHP是否可以执行命令行,2-我不知道1and1服务器是否安装了“ at”程序,3-我不知道我是否可以获取命令行以执行带有参数的PHP文件以使其工作。 而且,如果可以完成任何一项操作,我也不知道该怎么做。

您看到的很多事情我都不知道,但是我一直在努力自我告知和学习。我只是在这里问,因为我在绳子的尽头。

我列出的这些选项并不是详尽的列表,它们只是我找到的方法。

哪种方法可以更好地达到我的目的?以及如何做到?

相关事实:

  • 我们的主机和数据库位于虚拟服务器中的 1and1 中(这意味着我们没有完整的服务器,但可以与其他客户端共享一个服务器)

  • 尽管我们拥有“无限”的数据库空间和查询,但是仍然存在一定的硬性限制,即在一定的限制内可以执行多少个查询。

  • 我对使用linux感到陌生,而且我已经使用PHP多年了(直到我完成这份工作!),因此,如果您的解释不假设您具有深厚的知识,那就更好了。就我而言。

2 个答案:

答案 0 :(得分:6)

  

以编程方式为预定的每条消息编写Cronjobs。

不,您遇到的最大问题是,您必须预先预计何时将要发送的消息类型,这与您轻松取消消息的能力相冲突。通常,您将不得不担心要管理的许多状态(稍后会详细介绍),这很麻烦。您还需要确保之后再次清理计划的作业,因为cron只能设置重复任务。

  

Linux中的“ at”功能。

这基本上是cron,但用于非重复任务。更好,但是仍然有状态。尤其是对于共享主机,您的代码将始终在同一台计算机上执行还是在计算机可能重新启动时都有些不可预测。在这种情况下,您可能会失去计划的工作,所以这是不行的。

  

每分钟执行一次Cronjob,清除数据库表搜索,是否该发送其中一条消息了。

是的,这是这样做的方法。这里的最大优点是它是 stateless ,从某种意义上说,它将始终获取数据库的当前最新内容,因此它使您可以轻松地管理下一个数据库作业应做的工作运行,而不必在安排活动时就预料到。

  

恐怕可能会使数据库负担过多。

这是每分钟一个查询(如果写得不错的话)。大概您网站的每个页面加载都会产生一个或多个查询,并且一个正确构建的网站应该能够每秒处理数百到数千个负载。每分钟再查询一次就不会浪费时间。如果是这样,您将遇到更大的问题。

答案 1 :(得分:1)

我将亲自选择选项A,我已经在我从事的项目中使用了它。 在您的情况下,将数据存储在共享主机上,我将创建一个cronjob,每分钟运行一次(使用online service),并在文件夹中的某个位置命中php文件,并检查数据库表中是否必须执行任何操作。 您应该编写一些代码来处理您要发送的所有通知,并在它们的每一个中在db表中创建一行,并附上执行时间以及所有可用于创建通知和发送的详细信息。出来。

整个过程或多或少如下: -发生了一些事情,需要在5分钟内发出通知:在db表中创建该行,其unix时间或日期从现在开始为5分钟。 -从现在起3天需要发送通知,您使用与上述相同的步骤。

cronjob每分钟运行一次,并检查过期的订单(日期为<=现在的任何内容),如果有,脚本将处理这些行并执行订单(仅发送所需的通知)。

数据库不会太麻烦,每分钟只需执行一次查询(仅检查过期的订单)。