PHP,sendmail和传输 - 如何加快邮件发送速度

时间:2011-07-12 07:19:12

标签: php zend-framework email sendmail zend-mail

我刚刚编写了一组批量电子邮件类,用于处理大量电子邮件并根据传递的参数解析其内容。如果我在我的数据库中测试1000个随机收件人和1000个随机发件人的电子邮件,直到脚本点击send()部分(我现在评论它),我获得大约2秒的性能和20 MB峰值内存,这很棒。

但是,如果我取消注释发送部分,则发送需要30秒。这是不可接受的,我想以某种方式加快速度。从测试中可以明显看出,延迟是由$ mail-> send()调用引起的,好像它正在等待它返回一些东西然后继续循环并发送下一封电子邮件。

我想知道的是:如何加快send()调用?我该怎么做才能让它更快?我尝试使用两种发送方法:

  1. Zend SMTP传输,直接连接到服务器,只是发送。每1000封电子邮件需要30秒。
  2. 通过Zend_Mail发送邮件。在准备好每封电子邮件后,只需调用Zend_Mail的发送功能即可。这需要60秒。
  3. 请注意,排队绝对是一个选项,我已将其构建到我的课程中。所需要的只是激活一个cron,它就像一个魅力。但我想知道实际发送以及如何加快速度。所以,实际的send()调用。

3 个答案:

答案 0 :(得分:2)

您需要加速服务器上的MTA。我推荐Postfix,你真的读了每个设置,所以你知道如何微调它。对于商业解决方案,我听说PowerMTA是一个不错的选择,但我自己从未尝试过。

只有这么多性能可以挤出一台机器,但是一旦你正确配置了常规专用服务器应该能够提供相当大量的邮件。最大的性能瓶颈通常是存储邮件队列的磁盘驱动器,因此请考虑使用SAS(10k甚至15k RPM)或SSD驱动器。

答案 1 :(得分:2)

我将邮件保存在一个目录中并使用shell脚本发送它们(cron / daemon /...):

Zend_Mail::setDefaultTransport(
    new Zend_Mail_Transport_File(
        array(
            'path' => __DIR__,
            'callback' => function() {
                do {
                    $file = 'email-' . date('Y-m-d_H-i-s') . '_' . mt_rand() . '.eml';
                } while (file_exists($file));
                return $file;
            },
        )
    )
);

答案 2 :(得分:0)

您可以尝试深入了解PHP pcntl-fork函数。因此,您可以在解析下一封电子邮件时将发送留在另一个进程中。

计划B

您可以将电子邮件对象序列化并保存到数据库队列中,并让其他脚本在后台发送。此脚本可以在每次迭代时以无限循环(while true)运行,并带有一些sleep。您甚至可以运行此脚本的多个实例,但请确保两个脚本不会同时开始发送相同的电子邮件。

为确保脚本仍在运行,您可以在Unix计算机上使用monit。如果旧实例由于某种原因失败,则能够启动脚本。