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


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

我有一个邮件列表,每天早上我都要给这些人发邮件。目前这个数字大约是1000,它在我自己的VPS LINUX服务器上。

问题是,当作业运行时,我在服务器上的网站似乎挂起和超时相当多。

我认为在每次循环迭代之间添加几秒钟的睡眠命令会有所帮助,但我工作中的PHP开发人员刚刚告诉我,这对Apache在内存方面没有任何帮助,最好只是运行脚本而不使用任何睡眠命令。

我在这里和其他网站上读到有人建议在循环迭代之间添加sleep命令的文章,但如果这只是意味着Apache进程消耗更多内存并导致我的网站挂起,那么我不希望发生这种情况。

我正在从具有安全散列的CRON作业从我的域调用此作业。我通过我的网站外部调用它的原因,例如http://www.example.com/sendemails.php?secretcode=_--1033-449,我经常需要调试它,看看发生了什么,或者如果工作没有运行,我可以手动运行它并阅读页面上的调试。

是否有睡眠和Apache/网站超时的问题,或者我应该以另一种方式做到这一点,例如每10分钟启动一次脚本,并在更新数据库中针对该人的标志之前发送100封电子邮件,以便我知道他们已经发送了电子邮件(真/假)并从下一批开始。

然后在晚上特定时间后,例如下午6点,当我知道不应该发送电子邮件时,我可以轻松地将所有的标志重新设置为False,为明天做好准备。当然要确保下午6点以后不发电子邮件。

在作业运行期间,网站似乎挂起/超时,所以做这样的事情的首选方法是什么?

感谢Rob

似乎在我的情况下,无论如何,在循环迭代之间没有睡眠比有1秒睡眠要好得多

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

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

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

工作开始日期:2015年5月19日11:15:02我们成功发出工作完成日期:2015-05-19 11:50:54

因此,如果延迟1秒,并且由APACHE进程调用PHP脚本,则显示发送电子邮件需要35分钟。

加上我在工作期间遇到了网站/服务器问题。

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

然而,今天我在每次循环迭代和在一分钟内完成任务之间没有延迟。

我成功地发送了所有的电子邮件,没有收到VPS的警告。我的VPS做连接ping和HTTP ping (HEAD请求)到我的服务器。

工作开始日期:2015年5月20日11:16:01我们成功发出工作完成日期:2015-05-20 11:16:54

我想这表明你可以在不到一分钟的时间里发送1000封邮件。#

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

该脚本是可配置的,因此我可以将sleep设置为0以上以执行等待,并且在作业期间将所有调试消息存储在一个数组中,然后在最后以一个file_put_contents调用的方式输出到我的调试文件。这不是一个恒定的打开和关闭调试文件,因为我发现这总是一个性能杀手。

所以我猜答案对我来说至少是删除SLEEP,只是尽快完成工作,这样就不会有Apache连接等待使用服务器作为脚本运行。

如果我确实到了我有问题的阶段,我将把CRON作业移动到对PHP作业的内部CRON调用,这样所有APACHE进程都可以自由使用。然而,速度是关键问题。

谢谢你的建议