2012-04-18 107 views
2

我的网站每当有人发短信(私信)时,都会向我的用户发送一封电子邮件。它表示的内容是“有人在站点名称上向您发送了一条消息,请登录查看”。什么是通过PHP向大量用户发送电子邮件的最有效方式?

此刻我的网站是不是很受欢迎,所以我现在这样的方式一直没有问题的表现明智的:

发送一个PM
// code that sends pm here... 

    // code that stores pm in messages table here... 

    // notify user by emailing them right away 
    mail($user_email, $subject, $message); 

基本上每次执行邮件功能并在当场发送信息。因此,每发送100封邮件,邮件()就会被调用100次。

我期待我的网站越来越受欢迎,并且随着更多的用户来到更多的PM,所以我认为我目前的做法会成为一场性能噩梦。所以我在想这样做,而不是这样的:

// get the last message that was accounted for by the last cron 
$query = mysql_query(" SELECT `last_checked_id` FROM `settings` "); 
$last_checked_id = mysql_fetch_array($query); 


$user_emails = array(); 

// get all messages that were added to this table since the last time this cron ran 
$query = mysql_query(" SELECT `recipient_id`, `message_id` FROM `messages` WHERE `message_id` > '$last_checked_id' "); 

$i = 0; 
while($row = mysql_fetch_array($query)) { 

    if($i == 0) { 
     // set this as the last message processed 
     mysql_query(" UPDATE `settings` WHERE `last_checked_id` = '". $row['message_id'] ."' "); 
    } 

    // only put this user in the to email list if he hasn't been added already (since there can be multiple messages for the same user but we need to notify him only once) 
    if(!in_array($row['recipient_id'], $user_emails)) { 
     array_push($user_emails, $row['recipient_id']);  
    } 
} 
$i++; 

// send email to all users at one 
mail(implode(',', $user_emails), $subject, $message); 

我可以将这个脚本为计划并运行它每隔一小时。所有的电子邮件都是一次发送的,邮件功能只被调用一次。唯一的缺点是用户在他们收到PM时不会立即通知,而是在一小时内收到通知。但这并不是什么大事,我可以忍受。

我的问题是:

  • 是cron的方法显著更好的性能明智或增加微不足道
  • 这是多数大网站做到这一点?还是有更好的方法,一些已建立的图书馆可能会再见?

谢谢。从表

+1

关于SO最低调的PHP问题可能有一些见解http://stackoverflow.com/questions/3905734/how-to-send-100-000-emails-weekly – 2012-04-18 20:11:06

+1

相关:我也会限制一些电子邮件(如线程回复通知),以便他们不会突然收到10封电子邮件,并告诉他们同一个线索已被评论。 – Xeoncross 2012-04-18 20:11:21

回答

1

您可以将邮件一个MySQL表(emailoutgoing)

而且随着运行的每一个“3”分钟cron作业,就可以得到未发送(100?)的电子邮件,发送和标记行作为发送。

0

如果我理解正确,你会发送完全相同的电子邮件给每个人?在这种情况下,您应该为电子邮件地址使用密件抄送字段,否则每个人都会看到其他收件人,但在这种情况下,您可能会遇到可能会忽略电子邮件的反垃圾邮件引擎问题,因为他们不会将其用户视为电子邮件的收件人in或cc字段)。

但你真的应该想想发送个性化的电子邮件为每个用户

+0

我同意,实际上现在我发送了一封个性化的电子邮件,其中收到了他们收到的消息的预览以及一个链接,以查看更多回到我的网站。我只是很快把这个例子搞砸了,如果我还想发送预告,我必须展开脚本。所有用户都可以看到其他用户的好处。我不知道mail()函数是这样做的。 – TK123 2012-04-18 23:56:24

0

首先,阅读链接(如果您添加斯内克预览到谁发送的消息和/或消息的一部分,他们会更渴望)在Mike B的评论中。其次,你的代码有一些有趣的失败模式 - 它可能会失败,将所有邮件标记为已发送,并且没人会知道。关于CRON和其他无人值守流程(包括一般网站)的一个关键问题是,您需要知道什么时候出现问题。在发送邮件后,我会考虑在最后加上“更新”声明。放入某种日志记录,以便跟踪发生的情况。第三,请不要将此电子邮件发送给“to”字段中的所有这些人 - 正如Miro所言,它是垃圾邮件诱饵,但它也向用户提供了比他们应该有的更多信息 - 他们知道电子邮件您的网站随机其他用户的地址,他们在一个小时内碰巧遇到了PM。如果你正在建立一个交友网站或社交网络,那几乎肯定会让人生气。

最后,我曾参与过的其他有相似要求的网站往往有一个“事件”表,这个表由守护进程/服务风格进程监视。守护进程会做出明智的决定。我们设计的解决方案适合在多个线程甚至多个机器上运行,但实际上从来不需要这个。

eventID eventDate eventType  eventStatus  eventMeta 
------------------------------------------------------------------- 
1   1 Feb 2012  PM   NEW   <from>[email protected]</from><to>[email protected]</to> 
2   1 Mar 2012  PM   COMPLETE <from>[email protected]</from><to>[email protected]</to> 

的守护进程不断扫描记录,其中eventStatus是新的,将它们设置为“中”,与他们交易,然后设置:

所以,如下你可能有一个“事件”表状态完成。

这使您可以查看系统中正在发生的事情 - 如果某个记录正在“进行中”超过一秒钟,则某些内容已损坏。如果“新”记录的数量持续增长,并且“完整”记录的数量没有增加,则某些内容被打破。

相关问题