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

Dus*_*tin 12 php sleep function

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

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

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

Bil*_*eal 14

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

  • 在PHP服务器端脚本中使用sleep函数不是一个好主意.你在睡觉时浪费了一个网络服务器线程.此外,如果您睡眠时间过长,任何一台服务器都会因为卡住或者用户的浏览器超时并放弃而终止您的进程.正确的方法是使用cronjob或使用独立的过程. (9认同)
  • 你也会对自己的DoS攻击敞开大门.一些混蛋可以在一分钟内注册几百个帐户,而睡眠的apache线程会占用你所有的记忆. (4认同)

Fra*_*mer 8

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

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

应用程序的这一部分已成功运行,过去两年没有出现重大问题.唯一的烦恼是保持脚本运行 - 如果它因任何原因而失效,邮件就不会出来直到你重新启动它.但最坏的情况是,您可以定期通过cron重新启动它,例如每天.

如果我正在解决您的问题,我只需在队列表上放置一个"发送时间"列,并为这些电子邮件约会20分钟.然后邮件会SELECT * FROM mail_queue WHERE send_time <= NOW()

或者,您可以使用像beanstalkd这样的真实职位.我选择队列表只是为了保持我的应用程序堆栈简单.