PHP在几个小时后运行脚本


PHP run script after few hours

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

php sendMsg.php 249

其中number是消息的ID

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

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

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

您说过您不想使用cron作业,因为您只想发送一次消息,但这是对为这种任务编写cron作业的错误理解

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

你不想让PHP程序一直在你的服务器上为每一条消息运行;这将浪费服务器资源,即使它们在持续时间内都只是sleep()

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

您的消息创建程序不会被编写为准确地发送消息;相反,它会将它插入数据库,并附上发送所需的时间。

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

这是写这种东西的标准方式,所以人们向你推荐它也就不足为奇了。

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

它还使它更加健壮。想象一下,如果您的服务器必须重新启动。如果你让一堆PHP程序运行数小时,等待他们发送消息的时刻,那么它们都会丢失。另一方面,如果他们将消息保存到DB中,那么一旦服务器重新启动,cron作业就会找到它们并正确发送它们。

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

您不想使用cron作业有什么原因吗?这将是发送信息最简单、最有效的方式。

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

  1. 创建一个存储要发送的消息的表,其中包含要发送的时间戳和isSend的标志
  2. 每1分钟创建一个cronjob-start php-script,它发送带有时间戳<当前时间和isSend=false

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

$hours = 2;
$command = sprintf('echo "php sendMsg.php 249" | at now + %d hours', $hours);
exec($command);