Php SwiftMailer库执行速度慢
我正在尝试在这个邮件系统中实现swiftmailer。我的客户有大约30万封活动电子邮件,需要半定期发送。系统最初是为sendmail和php的mail()函数配置的。我已经安装了最新版本的postfix 可能是我的期望太高了,但我的印象是,这个东西可以让很多电子邮件快速进入队列,这正是我所需要的。所有的速率处理和调节都是在后缀端完成的,因此能够以我的后缀设置能够处理的速度对它们进行排队将是非常棒的 虽然我可以实现将联系人直接插入队列的方法,但我宁愿根据各种选项(如smtp服务器的全局发送速率)限制进入队列的电子邮件输入 下面的代码只是一些需要测试的基本代码。它循环通过30个单独的邮件smtp帐户,每个帐户都有自己的速率属性。我试图从数据库中提取每个cron的最大电子邮件数量,然后使用Php SwiftMailer库执行速度慢,php,email,postfix-mta,swiftmailer,Php,Email,Postfix Mta,Swiftmailer,我正在尝试在这个邮件系统中实现swiftmailer。我的客户有大约30万封活动电子邮件,需要半定期发送。系统最初是为sendmail和php的mail()函数配置的。我已经安装了最新版本的postfix 可能是我的期望太高了,但我的印象是,这个东西可以让很多电子邮件快速进入队列,这正是我所需要的。所有的速率处理和调节都是在后缀端完成的,因此能够以我的后缀设置能够处理的速度对它们进行排队将是非常棒的 虽然我可以实现将联系人直接插入队列的方法,但我宁愿根据各种选项(如smtp服务器的全局发送速率)
batchsend()
发送所有电子邮件,然后循环到下一个smtp帐户,发送最大值,等等
从技术上讲,它确实有效,但速度非常慢。以每个smtp帐户60/min的速率,每个帐户大约需要15-20秒,这显然不起作用,也完全不是我所期望的
有没有什么东西真的很明显,为什么这会发送得这么慢?smtp服务器看起来很好,没有过载或类似的问题。没有后缀错误,没有明显的错误
一旦电子邮件进入队列,我就让postfix发挥作用,这很神奇。它以合理的速度进入队列,这变得很困难。我知道swiftmailer是解决我所有问题的神奇方法,但我确信它应该比现在发送得更快。有什么想法或建议吗
$query = "SELECT * FROM `smtp`";
$result = mysql_query($query) or die(mysql_error());
$num_rows1 = mysql_num_rows($result);
while($row = mysql_fetch_array($result)){
$smtp = $row['ip'];
$login = $row['user'];
$pass = $row['pass'];
$smtp_domain = $row['domain'];
$querya = "SELECT * FROM `mailer_lists` ml JOIN `mailer_controller` mc ON ml.project_name = mc.project_name LIMIT ".$global_limit."";
$resulta = mysql_query($querya) or die(mysql_error());
$num_rows2 = mysql_num_rows($resulta);
// quickly check if any mail returned query
if ($num_rows2 < 1){
mysql_close($connection);
echo "Nothing to mail... \n";
die();
}
while($rowa = mysql_fetch_array($resulta)){
$email[] = $rowa['email'];
$project_name = $rowa['project_name'];
$from_name = $rowa['from_name'];
$subject = $rowa['subject'];
$body = $rowa['body'];
$from = array($spun_from_email => $spun_from_name);
}
require_once 'swift/swift_required.php';
$transport = Swift_SmtpTransport::newInstance(''.$smtp.'', 25)
->setUsername($login)
->setPassword($pass)
;
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance()
->setSubject($subject)
->setFrom($from)
// ->addPart('add part message', 'text/html')
// ->attach(Swift_Attachment::fromPath(''))
->setTo($email)
->setBody($body)
;
$mailout = $mailer->batchSend($message);
// ->addPart('add part message', 'text/html')
// ->attach(Swift_Attachment::fromPath(''))
;
$queryb = "DELETE FROM `mailer_lists` WHERE `project_name` = '".$project_name."' AND `email` = '".implode('\' OR `email` = \'',$email)."'";
$resultb = mysql_query($queryb) or die(mysql_error());
$c++;
echo "sent $num_rows1 emails to smtp $c \n";
}
$query=“从“smtp”中选择*”;
$result=mysql\u query($query)或die(mysql\u error());
$num_rows1=mysql_num_rows($result);
while($row=mysql\u fetch\u数组($result)){
$smtp=$row['ip'];
$login=$row['user'];
$pass=$row['pass'];
$smtp_domain=$row['domain'];
$querya=“从`mailer\u列表中选择*ml加入`mailer\u控制器`mc ON ml.project\u name=mc.project\u name LIMIT”。$global\u LIMIT.”;
$resulta=mysql\u query($querya)或die(mysql\u error());
$num_rows2=mysql_num_rows($resulta);
//快速检查是否有邮件返回查询
如果($num_rows2<1){
mysql_close($connection);
回显“无需邮寄…\n”;
模具();
}
while($rowa=mysql\u fetch\u数组($resulta)){
$email[]=$rowa['email'];
$project_name=$rowa['project_name'];
$from_name=$rowa['from_name'];
$subject=$rowa['subject'];
$body=$rowa['body'];
$from=数组($spin\u from\u email=>$spin\u from\u name);
}
require_once“swift/swift_required.php”;
$transport=Swift_SmtpTransport::newInstance('.$smtp'',25)
->setUsername($login)
->设置密码($pass)
;
$mailer=Swift\u mailer::newInstance($transport);
$message=Swift\u message::newInstance()
->setSubject($subject)
->setFrom($from)
//->addPart('addpartmessage','text/html')
//->attach(Swift_Attachment::fromPath(“”))
->setTo(电子邮件)
->实体($实体)
;
$mailout=$mailer->batchSend($message);
//->addPart('addpartmessage','text/html')
//->attach(Swift_Attachment::fromPath(“”))
;
$queryb=“从'mailer'列表中删除,`project\u name`='.$project\u name.''和'email`='.''。内爆('\'或'email`=''.$email)。”;
$resultb=mysql\u query($queryb)或die(mysql\u error());
$c++;
echo“已将$num_rows1电子邮件发送到smtp$c\n”;
}
您的问题不是您正在使用的库。这太慢了,因为你正在向电子邮件服务器发送大量数据……所以postfix在回复你之前会尝试处理所有数据。尝试在不关闭连接的情况下同时发送一封电子邮件,这样电子邮件服务器可以更快地处理您发送给它的每封电子邮件,并更快地返回答案
- 将以下行移到脚本顶部
require_once'swift/swift_required.php'代码>
- 使到smtp服务器的连接延迟您不需要每次发送电子邮件时都进行连接。在顶部连接一次,检查连接是否处于活动状态(否则再次连接),发送电子邮件并清除字段
至
,自
,等等
- 从顶部的数据库中抓取您的smtp设置,然后在
时删除巨人。这根本不能使代码可读
在一些函数周围插入对time()的一些调用,然后在最后比较它们,看看瓶颈真正在哪里。这可能不是你所期望的事实上,我对斯威夫特·梅勒的看法似乎是错误的。使用batchsend()可以简化send()方法,为您执行循环,但不一定更快。Facebooks xhprof听起来是解决问题的完美工具。这是一个非常轻量级的分析器,可以可视化缓慢的下降,但我不能同意这个答案。在我的票务系统中,我只发送过一次简单的邮件,但邮件发送的时间仍然很长。@Eugene可能有很多因素。你的中继服务器在哪里?在同一个网络上,或者您正在使用诸如Sengrid之类的PAAS服务?考虑到这一点,我们可以向前移动您可以共享的任何代码摘录?所以我们可以解决这个问题?这就是我使用的代码。我必须马上说,细枝模板不是这里的时间问题,它也和html文件一样轻。我怀疑你是否在同一个网络中,除非你的代码托管在谷歌的服务器上。通过TLS连接到谷歌的smtp不是琐事