2013-02-13 123 views
1

我有一个PHP网站,用户可以安排消息发送。我可以发送消息,类似命令这一个:几小时后PHP运行脚本

php sendMsg.php 249 

其中数字是消息

很多人建议使用cron作业的ID,但因为我不想在区间cron运行此是没有选择的(只有一次 - 例如3小时后)。 我的想法如下:

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

但是这不会工作,因为它会阻止PHP的进一步执行。达到此目的最简单的方法是什么?

+0

你舒尔它块完整的PHP?因为每个执行php cli应该导致一个自己的线程? – Dukeatcoding 2013-02-13 16:10:43

+0

你为什么把睡眠放在'exec'中? – 2013-02-13 16:10:54

+0

顺便说一句。我们在谈论什么样的信息 – Dukeatcoding 2013-02-13 16:11:26

回答

-1

忽略的cron的建议,如果你想简单地等待一段时间再使用at调度:

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

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

0

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

+0

这不是一个答案;你应该评论这个问题... – 2013-02-13 16:33:27

+0

我不同意。答案很清楚地表明,cron作业将是发送消息的最简单和最有效的方式。 – premisoft 2013-02-13 16:37:49

+0

我的意思是:你要求作者澄清他为什么放弃使用cron作业。使用cron作业对作者来说不是一个新的解决方案,因为他明确地告诉他不想使用它,并且我们不知道是否有很好的理由。当他告诉我们他的理由时,您可以就此进行辩论... – 2013-02-13 16:49:45

0

我认为一个cronjob IST仍然以正确的方式

  1. 创建一个表,其中要发送的邮件存储,使用时的时间戳是发送和isSend
  2. 创建一个标志的cronjob - 开始PHP skript每1分钟,这与时间戳<当前时间和isSend =假
1

你说你不想使用cron作业,因为你只需要发送一次的消息,但这些消息发送这是误解t的方式将为此类任务编写一个cron作业

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

您不希望有一个PHP程序坐在您的服务器上,随时为您的服务器上的每个消息;这会浪费服务器资源,即使它们在整个过程中都只是sleep()

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

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

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

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

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

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