2

我有一个 PHP 网站,用户可以安排要发送的消息。我可以使用类似于此的命令发送消息:

php sendMsg.php 249

其中 number 是消息的 ID

许多人建议使用 cron 作业,但由于我不想在间隔 cron 中运行它,所以没有选择(只有一次 - 例如 3 小时后)。我的想法如下:

$seconds = $hours*60*60;
exec('sleep '.$seconds.'; php sendMsg.php 249');

但这不会起作用,因为它会阻止 php 进一步执行。实现这一目标的最简单方法是什么?

4

5 回答 5

3

您说您不想使用 cron 作业,因为您只希望消息发送一次,但这是对为此类任务编写 cron 作业的方式的误解

考虑这样一种情况,您有许多用户创建许多要在不同给定时间点发送的消息。

您不想让 PHP 程序一直在您的服务器上运行,以处理这些消息中的每一条;这会浪费服务器资源,即使它们都只是在sleep()这段时间内运行。

相反,人们会使用 cron 作业每分钟运行一次短暂的 PHP 程序(或任何适合您的时间间隔)。

您的消息创建程序不会被编写为实际发送消息;相反,它将连同需要发送的时间一起插入到数据库中。

同时,cronjob PHP 程序会每分钟扫描一次这个数据库,看看是否有任何消息要发送但尚未发送。然后它将发送这些消息并在数据库上将它们标记为“已发送”。

这是编写这种东西的标准方式,所以人们向你推荐它并不奇怪。

这样做意味着您的系统上运行的程序永远不会超过必要的时间。两个 PHP 程序都快速完成它们的工作并退出,这意味着没有人一直在等待它们。

它也使它更加健壮。想象一下,如果您的服务器必须重新启动。如果你有一堆 PHP 程序运行几个小时等待它们发送消息的时刻,它们都会丢失。另一方面,如果他们已将消息保存到数据库,则 cron 作业会在服务器重新启动后找到它们并正确发送它们。

于 2013-02-13T16:22:15.640 回答
2

将时间表放入数据库中。每分钟左右运行一次cronjob,检查数据库是否应该在这一分钟内发送消息,然后发送。

于 2013-02-13T16:11:29.567 回答
0

您是否有不想使用 cron 作业的原因?这将是发送消息的最简单和最有效的方式。

于 2013-02-13T16:12:40.157 回答
0

我认为 cronjob 仍然是正确的方法

  1. 创建一个存储要发送消息的表,其中包含发送时间的时间戳和 isSend 的标志
  2. 创建一个 cronjob - 每 1 分钟启动一次 php 脚本,它发送时间戳 < 当前时间且 isSend = false 的消息
于 2013-02-13T16:12:51.220 回答
-1

忽略 cron 的建议,如果您只想等待一段时间然后使用at调度程序:

$hours = 2;
$command = sprintf('echo "php sendMsg.php 249" | at now + %d hours', $hours);
exec($command);
于 2013-02-13T16:29:02.890 回答