6

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

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

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

  1. Zend SMTP 传输,直接连接到服务器并发送。每 1000 封电子邮件需要 30 秒。
  2. 通过 Zend_Mail 发送邮件。在准备好每封电子邮件后,只需调用 Zend_Mail 的发送函数。这需要 60 秒。

请注意,排队绝对是一种选择,我已经将它内置到我的课程中。所需要的只是激活一个 cron,它就像一个魅力。但我想知道实际发送以及如何加快发送速度。因此,实际的 send() 调用。

4

3 回答 3

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;
            },
        )
    )
);
于 2011-07-12T13:10:57.823 回答
2

您将需要加快服务器上的 MTA。我推荐 Postfix,并且您确实阅读了每个设置,以便您知道如何对其进行微调。对于商业解决方案,我听说 PowerMTA 是一个不错的选择,但我自己从未尝试过。

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

于 2011-07-12T07:23:32.560 回答
0

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

B计划

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

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

于 2011-07-12T07:24:47.497 回答