繁体   English   中英

使用睡眠命令在PHP中发送大量电子邮件,并防止域在工作期间挂起

[英]Sending large number of emails in PHP with a sleep command and preventing the domain from hanging during the job

我有一个电子邮件列表,我必须每天早上向其发送电子邮件。 目前该数字约为1000,位于我自己的VPS LINUX服务器上。

问题是,当作业运行时,我在服务器上拥有的网站似乎挂起并且超时很多。

我以为在每次循环的迭代之间添加几秒钟的sleep命令会有所帮助,但是我工作的一位PHP开发人员告诉我,这不会对Apache的内存有所帮助,因此无需任何睡眠命令即可运行脚本。

我在这里和其他站点上读过文章,人们建议在循环迭代之间添加sleep命令,但是如果这仅意味着Apache进程占用更多内存并导致我的站点挂起,则我不希望这种情况发生。

我正在使用安全哈希从CRON作业中从我的域中调用此作业。 我通过我的网站从外部调用它的原因,例如http://www.example.com/sendemails.php?secretcode=_-- 1033 -449是因为我经常需要调试它以查看发生了什么或者是否作业尚未运行,我可以手动运行它并阅读页面上的调试信息。

睡眠和Apache /网站超时是否存在问题,还是我应该以其他方式进行操作,例如每10分钟进行一次批处理启动脚本并发送100封电子邮件,然后在数据库中针对该人更新标志,所以我知道他们已经发送了一封电子邮件(对/错),并从下一批开始。

然后在某个时间之后的晚上,例如晚上6点,当我知道不应该发送任何电子邮件时,我可以轻松地将所有标志重新设置为False,以备明天使用。 当然,请确保下午6点后没有发送电子邮件。

这样做的首选方式是什么,因为似乎在作业运行期间网站挂起/超时。

谢谢

在我看来,无论如何,在两次循环迭代之间都没有睡眠比一秒钟的睡眠要好得多

我在VPS上设置了警告电子邮件,昨天在发送批处理期间,我收到一个消息,说超时是在特定位置发生的(Rackspace从伦敦,芝加哥和达拉斯进行了3次测试),有2个位置返回的连接时间超过25秒到我的服务器-不是HTTP PING,而是仅与普通PING连接。

我在批处理作业的末尾发送成功的电子邮件,以告诉我发生了什么,该作业何时开始和结束以及发出了多少电子邮件。

这是昨天的电子邮件,循环中的每次迭代之间有1秒的睡眠时间。

职位开始日期:2015-May-19 11:15:02我们已成功向订阅者发送了945封电子邮件职位完成日期:2015-May-19 11:50:54

因此,延迟了1秒钟,并通过APACHE进程调用了PHP脚本,结果表明发送电子邮件花费了35分钟。

另外,我在工作期间遇到网站/服务器问题。

检查我的调试脚本后,发现发送大量电子邮件之间的间隔时间超过1秒,因此该作业显然导致服务器出现问题。

但是今天,我在每次循环迭代和一分钟内完成工作之间没有任何延迟。

我成功发送了所有电子邮件,但我的VPS没有任何警告。 我的VPS既对我的服务器执行Connection PINGS也对HTTP Pings(HEAD请求)进行操作。

工作开始日期:2015-May-20 11:16:01我们已成功向订阅者发送了945封电子邮件。工作完成日期:2015-May-20 11:16:54

我想这表明您可以在一分钟内发送1000封电子邮件。

这是一个标准的MySQL循环,用于从数据库中获取要发送电子邮件的人的电子邮件/姓名,并使用Apache进程,例如对保存脚本的网页的CRON调用,而不是对PHP文件的内部调用。

该脚本是可配置的,因此我可以将sleep设置为0以上以进行等待,并且在作业过程中将所有调试消息存储在一个数组中,然后最后通过一个file_put_contents调用将其输出到我的调试文件中。 这不是不断地打开和关闭调试文件,因为我发现这始终是性能的杀手。

因此,我想答案至少是删除SLEEP并尽快完成工作,以便在脚本运行时不会建立等待使用服务器的Apache连接。

如果确实遇到问题,我将把CRON作业移到PHP作业的内部CRON调用,以便所有APACHE进程都可以免费使用。 但是速度是关键问题。

谢谢您的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM