睡眠功能使用服务器资源?

Posted

技术标签:

【中文标题】睡眠功能使用服务器资源?【英文标题】:Sleep function uses server resources? 【发布时间】:2010-03-04 04:45:44 【问题描述】:

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

第二个原因:我听说有人使用睡眠功能发送大量电子邮件。由于我的服务器每小时只允许 100 封电子邮件,我想使用 sleep 功能让脚本休眠一个小时,然后从它接收到的地方继续。

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

【问题讨论】:

【参考方案1】:

虽然进程是sleeping,但它不会消耗 CPU 时间,但进程的工作集仍然需要物理内存和/或页面文件来支持该进程。换句话说,php 解释器进程需要保持运行。只要您的服务器有足够的 RAM,这应该不是问题。

【讨论】:

如果我的托管服务信誉良好(例如,godaddy),我可能不必担心 RAM 问题吗?感谢您的帮助! 在 PHP 服务器端脚本中使用 sleep 函数不是一个好主意。您在睡觉时正在浪费网络服务器线程。此外,如果您睡眠时间过长,任何服务器都会因为卡住而终止您的进程,或者用户的浏览器将超时并放弃。正确的方法是使用 cronjob 或使用独立进程。 您也会对微不足道的 DoS 攻击敞开心扉。一些混蛋可以在一分钟内注册几百个帐户,而休眠的 apache 线程会占用你所有的内存。 我假设这不会是 OP 允许在任何情况下一次在多个进程上运行的东西。如果你有 10 分钟的执行时间——即使是在睡觉——你的服务器将不能很好地处理负载。然而,OP 对电子邮件路由的描述似乎最多可以安排在几个进程上而不会出现问题。 如果我需要等待一段时间,然后做一些事情,然后在我的响应中使用特定数据进行响应怎么办?显然,我不能在单独的脚本中安排“延迟契约”的执行……或者,我可以吗?【参考方案2】:

电子邮件发送时间变化很大,因此无论您做什么,都不会在 20 分钟内将电子邮件发送到某人的收件箱。

我使用一个长时间运行的后台脚本(从 CLI 而非 apache 启动)来处理电子邮件发送。我的应用程序将电子邮件转储到队列表中,邮件程序脚本每 15 秒轮询一次。它在民意调查之间休眠()。这样,我只有一个脚本尝试连接到 SMTP 服务器并处于休眠状态。

该应用程序的这一部分在过去 2 年中一直成功运行,没有出现重大问题。唯一的烦恼是保持脚本运行——如果它因任何原因出现故障,邮件不会发出,直到你恢复它。但最坏的情况是,您可以定期通过 cron 重新启动它,例如每天。

如果我要解决您的问题,我只需在队列表中添加一个“发送时间”列,并在 20 分钟后发送这些电子邮件。然后邮件程序将SELECT * FROM mail_queue WHERE send_time <= NOW()

或者,您可以使用真正的作业队列,例如 beanstalkd。我选择队列表仅仅是为了让我的应用程序堆栈简单。

【讨论】:

【参考方案3】:

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

这仅在以下情况下有效:

你在 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 来处理所有传递的参数并做任何你想做的事情。

【讨论】:

【参考方案4】:
sleep();

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

是的,它会在你设置为 sleep(...) 时减慢速度。

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

this page 中有人说

记住 sleep() 的意思是“让 PHP 有时间做一些其他的事情”。 这意味着 sleep() 可以被信号中断。如果您与 pcntl_signal() 和朋友一起工作,这一点很重要。

【讨论】:

【参考方案5】:

代替服务器 SLEEP,即sleep(3);

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

if (empty($_COOKIE['my_Timer']))

   setcookie('my_Timer', "blabla",  time()+999999, '/');

die('<script>window.setTimeout(\'window.location="'.$_SERVER['REQUEST_URI'].'"; \',3000);</script>');


【讨论】:

以上是关于睡眠功能使用服务器资源?的主要内容,如果未能解决你的问题,请参考以下文章

11 linux011用于进程共享资源的睡眠与唤醒

饮食、睡眠和呼吸单元测试/TDD/BDD [关闭]

Linux下的sleep是睡眠还是忙等?占用CPU资源不?

信号量的实现

linux中怎样会引起进程睡眠呢?

使用node搭建静态资源服务器