每当有人 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);
基本上每次发送 PM 时,都会执行邮件功能,并在现场发送消息。因此,每发送 100 条消息,mail() 就会被调用 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);
我可以将此脚本设置为 cron 并让它每小时运行一次。所有的电子邮件都是一次性发送的,邮件功能只被调用一次。唯一的缺点是用户在收到 PM 时不会立即收到通知,而是在一小时内通知一次。但这没什么大不了的,我可以忍受。
我的问题是:
- cron 方法在性能方面明显更好还是可以忽略不计
- 这是大多数大型网站的做法吗?还是有更好的方法,一些已建立的图书馆可能会?
谢谢。