Amazon SES:如何加速这个PHP示例的卷曲?

时间:2012-01-18 14:17:23

标签: php curl amazon-web-services

我的亚马逊简单电子邮件服务帐户理论上可以处理14封电子邮件/秒,但我的代码每秒只能达到1或2封。任何有关如何提高HTTP-POST速率的帮助表示赞赏。我正在粘贴下面的代码来征求意见。如果可能,请发布您的代码提示而不是链接。谢谢!

注意:以下代码包含在引用电子邮件数据库的 foreach 循环中。我通过HTTP-POST发送的每封电子邮件都是个性化的,如$ MAIL字符串中所示,并通过下面的curl代码块发送。我还要提一下,我不关心HTTP-POST响应。

$DATE = gmdate('D, d M Y H:i:s e');
$HASH = hash_hmac('sha1', $DATE, $AWSPRI, true);
$KEYS = base64_encode($HASH);
$headers = array();
$headers[] = "Host: email.us-east-1.amazonaws.com";
$headers[] = "Content-Type: application/x-www-form-urlencoded";
$headers[] = "Date: ".$DATE;
  $auth = "AWS3-HTTPS AWSAccessKeyId=".$AWSPUB;
  $auth .= ",Algorithm=HmacSHA1,Signature=".$KEYS;
$headers[] = "X-Amzn-Authorization: ".$auth;
$url = "https://email.us-east-1.amazonaws.com/";
$MAIL =  "Action=SendEmail&Source=".$FROM_ENCODE."&ReturnPath=".$BOUNCE_ENCODE."&Destination.ToAddresses.member.1=".$SUBSCRIBER_ENCODE."&Message.Subject.Data=".$SUBJECT_ENCODE."&Message.Body.Html.Data=".$EMAIL_BODY_ENCODE;
$aws = curl_init();
curl_setopt($aws, CURLOPT_POSTFIELDS, $MAIL);
curl_setopt($aws, CURLOPT_HTTPHEADER, $headers);
curl_setopt($aws, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($aws, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($aws, CURLOPT_HEADER, false);
curl_setopt($aws, CURLOPT_URL, $url);
curl_setopt($aws, CURLOPT_RETURNTRANSFER, true);
curl_exec($aws);
curl_close($aws);

4 个答案:

答案 0 :(得分:1)

首先,您可以使用一些基准测试代码来找出瓶颈。

其次,在黑暗中拍摄,你可以重复使用http连接。

第三,也许是正确的答案,在一个高带宽的国际网络中心 - 詹姆斯邦德风格中加强专用服务器。

答案 1 :(得分:0)

我还没有测试过这个,但是我要将电子邮件数组分成5个块,并通过HTTP-POST例程同时传递每个邮件。原则上,这应该将发送速率降低5倍。

答案 2 :(得分:0)

根据我之前的经验,我发现重用cURL句柄可以显着降低开销。只需要执行curl_init()一次,并且只设置每次更改的选项。

你可以做的另一件事就是使用mutli curl,它允许curl处理多线程。

http://php.net/manual/en/function.curl-multi-init.php

答案 3 :(得分:0)

使用batches。一次配置14封电子邮件,并通过返回收集每个CURL挂起而不是立即处理 - 请参阅returnCurlHandle选项。

因此将有14个并发的CURL会话,并且所有批处理将需要大约2-4秒来处理。