2012-04-18 5 views
2

내 웹 사이트는 누군가의 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?

감사합니다. 테이블에서

+1

그래서 대부분의 downvoted PHP 질문에 대한 통찰력이있을 수 있습니다. http://stackoverflow.com/questions/3905734/how-to-send-100-000-emails-weekly –

+1

관련 내용 : 일부 이메일 (예 : 스레드 답장 통지). 그래서 그들은 같은 스레드가 주석 처리되었다는 것을 모두 갑자기 말해주는 10 개의 전자 메일을받지 못합니다. – Xeoncross

답변

1

당신은

분 "3"모든를 실행하는 cron 작업에

, 당신은 보내지 않은 얻을 수있는 메일을 (emailoutgoing) MySQL의 테이블을 삽입 할 수 있습니다 (100?) 이메일, 전송로 보내고 마크 행.

0

정확하게 이해한다면 모든 사람에게 똑같은 이메일을 보낼 것입니까? 이 경우 전자 메일 주소에 숨은 참조 필드를 사용해야합니다. 그렇지 않으면 모든 사람이 다른 수신자를 볼 수 있지만이 경우 전자 메일 수신자로 사용자를 볼 수 없기 때문에 전자 메일을 무시할 수있는 스팸 방지 엔진에 문제가 발생할 수 있습니다 to 또는 cc 필드). 하지만 당신은 정말 링크를 읽어, 첫째

+0

나는 동의한다, 실제로 나는 그들이받는 메시지의 미리보기와 함께 개인화 된 이메일을 링크와 함께 보내 나의 사이트로 돌아 간다. 방금 스크립트를 확장해야하는 미리보기를 보내려면이 예제를 빠르게 만들었습니다. 모든 사용자에게 표시되는 다른 사용자에 대한 좋은 지적. mail() 함수가 이것을 인식하지 못했습니다. – TK123

0

(당신이 메시지 및/또는 메시지의 일부를 보낸 사람에 스 네크 미리보기를 추가하는 경우가 훨씬 더 열망 것) 각 사용자의 개인 이메일을 보내 대해

을 생각해야 Mike B의 코멘트.

두 번째로, 코드에는 재미있는 오류 모드가 있습니다. 실패 할 수도 있고 모든 메일을 보낸 것으로 표시 할 수 있으며 누구도 알지 못할 것입니다. CRON 및 기타 무인 프로세스 (일반적으로 웹 사이트 포함)의 핵심은 상황이 잘못 될 때를 알아야한다는 것입니다. 나는 메일을 보낸 후에 끝에 "업데이트"문장을 넣는 것을 고려할 것입니다. 어떤 일이 벌어지고 있는지 추적 할 수 있도록 일종의 로깅을하십시오.

셋째, "받는 사람"필드에있는 모든 사람들에게이 이메일을 보내지 마십시오. Miro가 말했듯이 스팸 유혹이지만 사용자에게 더 많은 정보를 제공합니다. 그들은 이메일을 알고 있습니다. 귀하의 사이트에서 1 시간 이내에 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가 새로운 기록을 위해 검사를 설정

가 "진행 중"그들과 거래하고, 다음과 같이

그래서, 당신은 "이벤트"테이블이있을 수 있습니다 완료 할 상태.

이 기능을 사용하면 시스템에서 진행중인 작업을 볼 수 있습니다. 1 초 이상 "진행 중"인 경우에는 문제가 발생합니다. "NEW"레코드의 수가 계속 증가하고 "complete"레코드의 수가 증가하지 않으면 무언가가 깨집니다.

관련 문제