PHP在几个小时后运行脚本

PHP在几个小时后运行脚本,php,asynchronous,Php,Asynchronous,我有一个PHP网站,用户可以安排发送消息。我可以使用类似以下命令发送消息: php sendMsg.php 249 其中number是消息的ID 许多人建议使用cron作业,但由于我不想在间隔时间内运行它,cron没有选择,只能运行一次,例如3小时后。 我的想法如下: $seconds = $hours*60*60; exec('sleep '.$seconds.'; php sendMsg.php 249'); 但这不起作用,因为它会阻止php进一步执行。实现这一点最简单的方法是什么?将时

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

php sendMsg.php 249
其中number是消息的ID

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

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

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

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

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

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

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

我认为亲信仍然是正确的方式

创建一个存储要发送的消息的表,其中包含要发送的时间戳和isSend标志 每1分钟创建一个cronjob-start php skcript,它发送带有timestamp我认为权贵主义者仍然是正确的方式

创建一个存储要发送的消息的表,其中包含要发送的时间戳和isSend标志 每1分钟创建一个cronjob-start php skcript,它发送带有timestamp您说过您不想使用cron作业,因为您只希望消息发送一次,但这是对为此类任务编写cron作业的错误理解

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

你不想让一个PHP程序一直在你的服务器上为每一条消息运行;这将是对服务器资源的浪费,即使它们在整个过程中都只是在睡觉

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

您的邮件创建程序将不会被写入以实际发送邮件;相反,它会将它插入到数据库中,以及需要发送的时间

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

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

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


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

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

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

你不想让一个PHP程序一直在你的服务器上为每一条消息运行;这将是对服务器资源的浪费,即使它们在整个过程中都只是在睡觉

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

您的邮件创建程序将不会被写入以实际发送邮件;相反,它会将它插入到数据库中,以及需要发送的时间

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

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

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

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

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

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

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

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

您是否认为舒尔能够阻止完整的php?既然PHPCLI的每一个executioon都应该产生一个自己的线程,那么为什么要把睡眠放在exec中呢?顺便问一下,我们在谈论什么样的消息about@EM-我想延迟脚本执行。。。这不是很明显吗?Dukeatcoding-通过API发送的私人消息我真诚地认为您需要重新考虑cron的使用,它是为处理定期任务而设计的,除非您希望受到DoS攻击、注入攻击或其他攻击,否则您当前的想法将失败。如果您将用户条目插入到由脚本定期检查的数据库中,则不会遇到线程/进程过多或内存占用过大等问题。您是否认为它会阻止完整的php?既然PHPCLI的每一个executioon都应该产生一个自己的线程,那么为什么要把睡眠放在exec中呢?顺便问一下,我们在谈论什么样的消息about@EM-我想延迟脚本执行。。。这不是很明显吗?Dukeatcoding-通过API发送的私人消息我真诚地认为您需要重新考虑cron的使用,它是为处理定期任务而设计的,除非您希望受到DoS攻击、注入攻击或其他攻击,否则您当前的想法将失败。如果将用户条目插入到脚本定期检查的数据库中,则不会遇到线程/进程太多或内存占用过大等问题。我不同意。答案很明确,cron作业将是发送消息的最简单和最有效的方式。我的意思是:你是在向作者澄清为什么他放弃使用cron作业。对于作者来说,使用cron作业并不是一个新的解决方案,因为他明确地告诉我们他不想使用它,我们也不知道是否有充分的理由。当他告诉我们他的理由时,你可以对此进行辩论……事实上,他不想使用它,但这并没有减损这一事实,即它是最简单、最有效的方法。此外,这个问题更多的是修辞而不是好奇。我不同意。答案很明确,cron作业将是发送消息的最简单和最有效的方式。我的意思是:你是在向作者澄清为什么他放弃使用cron作业。对于作者来说,使用cron作业并不是一个新的解决方案,因为他明确地告诉我们他不想使用它,我们也不知道是否有充分的理由。当他告诉我们他的理由时,你可以对此进行辩论……事实上,他不想使用它,但这并没有减损这一事实,即它是最简单、最有效的方法。此外,这个问题更多的是修辞,而不是好奇。