几小时后PHP运行脚本

时间:2013-02-13 16:09:22

标签: php asynchronous

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

php sendMsg.php 249

其中number是消息的ID

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

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

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

您不希望所有这些消息都在您的服务器上运行PHP程序;它会浪费服务器资源,即使它们只是sleep()持续一段时间。

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

您的消息创建程序不会被写入以实际发送消息;相反,它会将其插入数据库,以及需要发送的时间。

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

这是编写此类内容的标准方式,因此人们向您推荐此内容并不奇怪。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

  1. 创建一个表,其中存储要发送的消息,时间戳何时发送以及isSend的标志
  2. 创建一个cronjob - 每隔1分钟启动一次php skript,它会发送带有时间戳<的消息。当前时间和isSend = false

答案 4 :(得分:-1)

忽略cron的建议,如果你想等一段时间再使用at调度程序:

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