我发现很少有旧的线程有类似的问题,但大多数都没有答案,或者如果有,这些建议与我的情况不相关。
我有一个完整的PHP邮件功能设置,它工作得很好。我必须在某一点上格式化我的硬盘,然后从头开始安装服务器。之后,PHP邮件功能变得缓慢。在研究解决方案时,我发现大多数人都推荐使用PHPMailer。我换了那个,但问题仍然存在。
大多数时候,我每页至少发送两封电子邮件,邮件主体不同,但使用的对象相同。大约有3-4秒的延迟。请在下面找到相关代码($email1和$email2是包含有效电子邮件地址的数组):
function sendEmail ($email1, $subject1, $message1, $email2, $subject2, $message2)
{
require_once('../PHPMailer/class.phpmailer.php');
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 0;
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'ssl';
$mail->Host = "smtp.gmail.com";
$mail->Port = 465;
$mail->IsHTML(true);
$mail->Username = $gmail_username;
$mail->Password = $gmail_password;
$mail->SetFrom($gmail_address,$email_title);
$mail->Subject = $subject1;
$mail->Body = $message1;
foreach($email1 as $k => $v) { $mail->AddAddress($v); }
if(!$mail->Send()) { $emailreturn['cust'] = 0; } else { $emailreturn['cust'] = 1; }
$mail->ClearAddresses();
$mail->Subject = $subject2;
$mail->Body = $message2;
foreach($email2 as $k => $v) { $mail->AddAddress($v); }
if(!$mail->Send()) { $emailreturn['partner'] = 0; } else { $emailreturn['partner'] = 1; }
$mail->ClearAddresses();
}
通过调试和消息,我没有看到任何错误,只是发送电子邮件的时间比平常长。
我尝试过的:
邮件设置中是否还缺少其他内容,或者是否有一些我应该检查的幕后配置?谢啦
这种缓慢(或超时导致的故障)是因为Google支持IPv6寻址,但您的网络不支持。(例如,Digital Ocean尚不支持SMTP通信的IPv6)。因此,请使用以下命令:
$mail->Host = gethostbyname("smtp.gmail.com");
gethostbyname()将返回IPv4地址。
对我来说,我的PHPMailer脚本从大约2分钟的执行时间
如果发送电子邮件之间的延迟确实是一个关键问题,那么您是否考虑过实现一种形式的多线程?每条消息的延迟可能是相同的,但如果您一次发送两个enail,则延迟基本上会减少一半。
实现这一点的一个简单方法是实现队列,消息通过非阻塞的HTTP/SQL调用发送。通过这种方式,您可以以最小的延迟发送尽可能多的邮件。
我还建议,如果可能的话,找到延迟最低的gmail服务器,并将其添加到您的主机文件中,以消除DNS查找。
还有一些性能提示:您只需要对include文件要求_once(),但每次调用都需要它(顺便说一句,include_once()更快)。为什么不只创建一次$mail对象,并在需要调用sendemail()时重用它?
另外,为什么不将Message1、subject1等作为一个数组传递,并将Message2、subject2等作为第二个数组传递?一般来说,在过程调用期间(至少在经典编程中)传递fwing参数会加快速度。
顺便说一句——不知道这是否可能——也许有一种方法可以保持与smtp.gmail.com.的持续连接,这也可以消除很多开销。
另外,通过您自己的meial服务器转发您的消息是一种选择吗?这将消除延误。
最后,我看到了谷歌的回复:[Gmail发送限制]`
Thank you for your message.
I understand you have a query regarding the Google Apps for Business sending limits. As
mentioned in our Help Center article at http://support.google.com/a/bin/answer.py?hl=en&
answer=166852, the daily limitation is 2000 messages in a 24-hour period not day. In general, our
servers can tolerate one message per second until sending limits are hit. We really don't
have an hourly or minute limitation for sending. If you send messages too quickly you may
get rate-limited but the account should not lock out.
By rate-limt, since in general one message per second, if you try to send too many messages per second
you may get a message telling you that the message cannot be send or you must wait before sending a
message.
`
如果您需要的话,我很乐意编写一个符合这些限制的类。请让我知道,不要花太长时间。
建议:使用另一个电子邮件主机/中继
发送电子邮件通常是一项缓慢的活动。无论出于什么原因(流量、流量优先级、邮件守护程序实现等),都需要花费大量时间。处理电子邮件流量的一种方法是不要根据您正在生成的响应发送邮件。更好的解决方案是异步进行。上面的一个建议(使用工作队列并使用cron作业清空工作队列)很棒。唯一的警告(取决于通信量)是,发送工作队列中所有电子邮件的时间可能大于cron任务之间的时间间隔。
另一个选择(这是我的首选)是使用像Rabbit MQ(可能是关于这个主题的更多好书/帖子)或Zero MQ(如果你是一个更可靠的程序员)这样的消息传递层。在这种情况下,您创建一个事件“发送电子邮件”并将其推送到队列。存在多个队列侦听器。一旦您的PHP脚本将电子邮件发送到队列,它就完成了,并继续前进。队列侦听器之一拾取消息并发送电子邮件。
这可以让您在构建解决方案时具有极大的灵活性。由于发送电子邮件的大部分时间似乎都是等待时间,因此您可以运行10个消费者程序来发送电子邮件,因为您知道单个发件人的大部分时间都是空闲的。(根据我的经验,发送电子邮件的等待时间很长,但CPU负载不高)。通过运行固定数量的使用者(您的PHP脚本是生产者),您可以限制发送邮件的速率/将系统资源用于发送邮件。
我已经实现了这种方法的变体,好的一面是,需要发生的其他缓慢的事情(如调整图像大小)可以使用相同的模式处理。随着您的成长,只需在其他机器上启动消费者,您就可以将部分工作卸载到这些机器上。