내 웹 사이트는 누군가의 PM (비공개 메시지)이 방문 할 때마다 내 사용자에게 이메일을 전송합니다. 그것은 "누군가 당신에게 SITE NAME에 메시지를 보냈고 그것을보기 위해 로그인"한 줄을 따라 말합니다. 이 일을 내 현재의 방법은 문제 성능 현명하지 않았다, 그래서 내 사이트가 인기없는 순간 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 개의 메시지를 보낼 때마다 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을 수신 할 때 즉시 통보되지 않지만 시간 내에 한 번 나타납니다. 그러나 그것은 큰 문제가 아니며 내가 살 수있는 것입니다.
내 질문은 :
- 는 크론 방법 훨씬 더 나은 성능을 현명하거나 무시할 증가
- 이 가장 큰 사이트가 그것을 할 방법입니다입니까? 아니면 더 나은 방법이 있습니까, 몇몇 확립 된 도서관 maybye?
감사합니다. 테이블에서
그래서 대부분의 downvoted PHP 질문에 대한 통찰력이있을 수 있습니다. http://stackoverflow.com/questions/3905734/how-to-send-100-000-emails-weekly –
관련 내용 : 일부 이메일 (예 : 스레드 답장 통지). 그래서 그들은 같은 스레드가 주석 처리되었다는 것을 모두 갑자기 말해주는 10 개의 전자 메일을받지 못합니다. – Xeoncross