2010-03-04 42 views
12

我有两个理由使用睡眠功能:首先,在他们与我们联系20分钟后自动发送确认电子邮件给客户。我不想使用cron作业,因为我希望它完全是20分钟(并且我厌倦了我的web服务器向我发送电子邮件,告诉我他们发起了cron作业......每20分钟发送一封新邮件! )睡眠功能使用服务器资源?

第二个原因:我听说有人用休眠功能发送群发电子邮件。由于我的服务器每小时只允许发送100封电子邮件,因此我想使用睡眠功能让脚本睡眠一个小时,然后继续它的拾取位置。

我的问题是:它使用服务器资源?它会减慢速度吗?使用睡眠功能还有其他问题吗?提前致谢!

回答

13

虽然进程为sleep ing,但它不会占用CPU时间,但进程的工作集仍需要物理内存和/或页面文件来支持该进程。换句话说,PHP解释器进程需要继续运行。只要你的服务器有足够的RAM,这应该不成问题。

+0

因此,如果我的托管服务信誉良好(例如,godaddy),我可能不必担心内存问题?谢谢你的帮助! – Dustin 2010-03-04 04:55:34

+9

在您的PHP serverside脚本中使用sleep函数并不是一个好主意。你在睡觉时正在浪费一个网络服务器线程。另外,如果你睡得太久,服务器将会阻止你的进程,或者用户的浏览器超时并放弃。 正确的做法是使用cronjob或独立进程。 – Vlad 2010-03-04 05:04:27

+4

你也会为自己的DoS攻击敞开大门。有些混蛋可能会在一分钟内注册几百个帐号,而睡眠Apache线程会占用你所有的内存。 – 2010-03-04 05:29:18

8

电子邮件的发送时间很不稳定,所以无论您做什么,您都不会在20分钟内收到一封电子邮件给某人的收件箱。

我使用长时间运行的后台脚本 - 从CLI启动而不是apache--来处理电子邮件发送。我的应用程序将电子邮件转储到队列表中,邮件程序脚本每15秒轮询一次。它在轮询之间睡眠()。这样,我只有一个脚本试图连接到SMTP服务器,并正在睡觉。

该部分的应用程序已成功运行,过去2年没有重大问题。唯一的烦恼就是让脚本继续运行 - 如果出于任何原因而停止运行,邮件不会一直出现,直到您恢复为止。但最糟糕的情况是,您可以定期通过cron重新启动它,例如日常。

如果我正在处理您的问题,我只需在队列表中放置一个“发送时间”列,并为这些电子邮件记录20分钟的日期。邮件会然后SELECT * FROM mail_queue WHERE send_time <= NOW()

或者,你可以使用一个真正的jobqueue像beanstalkd。我选择了队列表来保持我的应用程序栈简单。

-1
sleep(); 

是的,睡眠确实使用服务器资源。

是的,它会减慢你在睡眠中的时间(...)。

使用“睡眠”时还有其他问题。

有人在this page

请记住,睡眠()的意思是 “让PHP时间做一些其他的东西。” 这意味着sleep()可以被信号中断。如果您使用pcntl_signal()和朋友,这非常重要。

-1

而不是服务器睡眠,即sleep(3);

我用使用Javascript“客户端”睡眠:

if (empty($_COOKIE['my_Timer'])) {die('<script>window.setTimeout(\'window.location="'.$_SERVER['REQUEST_URI'].'"; \',3000);</script>');} 
setcookie('my_Timer', "blabla", time()+999999, '/'); 
0

知道这是一个非常古老的线程,但有些人可能会遇到,所以这里是另一个建议。

此,如果只会工作:

  • 您是Linux服务器
  • 可以通过命令上(象exec,一些共享主机不会允许这种)

睡觉,而不是很长一段时间,我认为这是一个糟糕的做法(对于这种情况),您可能会考虑使用at命令。

虽然cron作业是重复性工作的理想选择,但如果您只想在未来某个特定时间运行一次命令,那么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。