我有一个PHP网站,用户可以安排发送消息。我可以使用与此类似的命令发送消息:
php sendMsg.php 249
其中number是消息的ID
许多人建议使用cron作业,但由于我不想在间隔cron中运行它,因此没有选择(只有一次 - 例如3小时后)。 我的想法如下:
$seconds = $hours*60*60;
exec('sleep '.$seconds.'; php sendMsg.php 249');
但这不会起作用,因为它会阻止php进一步执行。实现这一目标的最简单方法是什么?
答案 0 :(得分:2)
将计划放在数据库中。每分钟左右运行一次cronjob,检查数据库是否应该在这一分钟内发送消息,然后发送。
答案 1 :(得分:2)
你说你不想使用cron作业,因为你只想发送一次消息,但这是错误理解为这种任务编写一个cron作业的方式
考虑一种情况,即您有许多用户创建了许多要在不同的给定时间点发送的消息。
您不希望所有这些消息都在您的服务器上运行PHP程序;它会浪费服务器资源,即使它们只是sleep()
持续一段时间。
相反,人们会使用cron作业每分钟运行一次短暂的PHP程序(或者适合你的任何时间间隔)。
您的消息创建程序不会被写入以实际发送消息;相反,它会将其插入数据库,以及需要发送的时间。
与此同时,cronjob PHP程序将每分钟扫描一次该数据库,以查看是否有任何消息要发送但尚未发送。然后它会发送这些消息,并在数据库上标记为“已发送”。
这是编写此类内容的标准方式,因此人们向您推荐此内容并不奇怪。
这样做意味着您的系统上运行的程序永远不会超过必要的时间。两个PHP程序都能快速完成工作并退出,这意味着没有人会等待它们。
它也使它更加健壮。想象一下,如果您的服务器必须重新启动。如果你有一堆PHP程序运行了几个小时等待他们的时间发送他们的消息,他们都会丢失。另一方面,如果他们已将消息保存到数据库,则cron作业会找到它们并在服务器重新启动后正确发送它们。
答案 2 :(得分:0)
您是否有理由不想使用cron作业?这将是发送消息的最简单,最有效的方式。
答案 3 :(得分:0)
我认为cronjob仍然是正确的方式
答案 4 :(得分:-1)
忽略cron的建议,如果你想等一段时间再使用at
调度程序:
$hours = 2;
$command = sprintf('echo "php sendMsg.php 249" | at now + %d hours', $hours);
exec($command);