我有两个使用睡眠功能的理由:首先,在他们联系我们20分钟后自动向客户发送确认电子邮件。我不想使用cron工作,因为我希望它完全是20分钟(而且我厌倦了我的网络服务器向我发送电子邮件告诉我他们发起了一个cron工作......每20分钟发一封新电子邮件! )
第二个原因:我听说有人使用睡眠功能发送大量电子邮件。由于我的服务器每小时只允许100封电子邮件,我想使用睡眠功能让脚本睡眠一小时,然后继续它拾取的地方。
我的问题是:它是否使用服务器资源?会减慢速度吗?使用睡眠功能还有其他问题吗?提前谢谢!
答案 0 :(得分:13)
虽然进程为sleep
,但它不会占用CPU时间,但进程的工作集仍然需要物理内存和/或页面文件来支持该进程。换句话说,PHP解释器进程需要继续运行。只要你的服务器有足够的RAM,这应该不是问题。
答案 1 :(得分:8)
电子邮件递送时间变化很大,因此无论您做什么,都不会在20分钟内收到某人收件箱的电子邮件。
我使用长时间运行的后台脚本 - 从CLI启动,而不是apache - 来处理电子邮件发送。我的应用程序将电子邮件转储到队列表中,邮件程序脚本每15秒轮询一次。它在民意调查之间睡觉()。这样,我只有一个脚本试图连接到SMTP服务器,然后睡觉。
该部分应用已成功运行,过去两年没有出现重大问题。唯一的烦恼是保持脚本运行 - 如果它因任何原因而失效,邮件不会熄灭直到你重新启动它。但最坏的情况是,您可以定期通过cron重新启动它,例如每日。
如果我正在解决您的问题,我只需在队列表上放置一个“发送时间”列,并为这些电子邮件约会20分钟。然后邮件将SELECT * FROM mail_queue WHERE send_time <= NOW()
或者,您可以使用像beanstalkd这样的真实职位。我选择队列表只是为了保持我的应用程序堆栈简单。
答案 2 :(得分:1)
知道它是一个非常古老的线索,但有些人可能会遇到,所以这是另一个建议。
这只适用于:
我认为这不是长时间睡觉,而是认为这是一种不好的做法(对于这种情况),你可能会考虑使用at命令。
虽然cron job非常适合重复性事项,如果您只想在将来的某个时间运行一次命令,at
是您最好的朋友。
这就是我在用户与网页互动后安排发送电子邮件X时间的方式。
示例:
$wait_time=time()+mt_rand(3600,36000);
//wait a random amount of time between 1 and 10 hours
//$wait_time=time()+1200 -if you want 20 minutes exactly.
$cmd_string=escapeshellcmd('php /path/to/script.php '.$par1.' '.$par2.' "'.$par3.'" '.$parX);
exec("echo -e '$cmd_string' | at ".date("Hi M d",$wait_time));
比你创建一个script.php,它处理所有传递的参数并做你想做的任何事情。
答案 3 :(得分:-2)
sleep();
是的,睡眠确实使用服务器资源。
是的,它会在您进入睡眠状态时减慢速度(...)。
使用“睡眠”时还有其他问题。
{{}}}中有人说
请记住,sleep()意味着“让PHP有时间做其他事情”。 这意味着sleep()可以被信号中断。如果您使用pcntl_signal()和朋友,那很重要。
答案 4 :(得分:-3)
而不是服务器SLEEP,即sleep(3);
我用过#34;客户端&#34;使用Javascript睡眠:
if (empty($_COOKIE['my_Timer'])) {
setcookie('my_Timer', "blabla", time()+999999, '/');
die('<script>window.setTimeout(\'window.location="'.$_SERVER['REQUEST_URI'].'"; \',3000);</script>');
}