2010-02-08 4 views
1

PHP 명령 줄에서 루프 스크립트를 실행하고 PHPMailer를 사용하여 고객에게 전자 메일을 보냅니다. 내가받는 문제는 PHPMailer가 false를 반환하면 명령 줄 스크립트가 종료된다는 것입니다. $mail->Send()이 거짓을 반환하면 스크립트가 중지 및 종료,PHP 명령 줄 스크립트가 false에서 종료 됨

while(the loop is valid){ 
    if(mail ID exists){ 
     set_time_limit(30); 
     ..compose mail.. 
     if($mail->Send()){ 
      ..Mark as success in database.. 
      usleep(10000); 
     } else { 
      ..Mark as failure in database.. 
      usleep(10000); 
     } 
    } 
    ..continue loop.. 
} 

: 여기

은 스크립트 의사입니다. 이것은 명령 행에서 PHP의 예상되는 동작입니까? 그렇다면 PHP가 false를 받았을 때 멈추지 말라고 말하는 방법이 있습니까?

도움 주셔서 감사합니다.

+2

send()가 종료 이유는 무엇입니까? 그것은 또한 스크립트 타임 아웃이거나 while 루프의 조건에서 실수 일 수 있습니다. – Thirler

+0

내 테스트에 따르면 스크립트의 루프 부분에서 오류가 발생하는 경우에만 스크립트가 종료됩니다. – Nirmal

+0

error_reporting = E_ALL 및 display_errors = true (또는 error.log를 주시하십시오)로 스크립트를 실행 했습니까? – VolkerK

답변

2

나는 $mail->Send() 함수 (또는 완전히 다른 것)가 스크립트 실행을 중단시키는 오류를 발생시키고 있다고 생각합니다.

데이터베이스에서 값이 업데이트되지 않습니다. 그렇다면 그렇게 될 것입니다. 이를 판별하기 위해 오류보고와 함께 스크립트를 실행하십시오.

error_reporting(E_ALL); 
ini_set('display_errors', true); 
+0

예! 값이 데이터베이스에서 갱신되지 않습니다. 오류보고 기능이 켜져 있지만 오류는보고되지 않습니다. – Nirmal

+0

PHPMailer 매뉴얼에 다음과 같이 쓰여 있습니다 :'Send()'는 메시지를 만들고 메일러를 지정합니다. 메시지가 성공적으로 전송되지 않으면 false를 반환합니다. ErrorInfo 변수를 사용하여 오류에 대한 설명을보십시오. 성공하면 true를 반환하고 실패하면 false를 반환합니다. – Nirmal

+0

PHPMailer는'@'Suppressor를 사용하여 실패를 조용히하려고 할 수 있습니다. 그러나 치명적 오류 일 경우에는 관계없이 종료됩니다. –

1

는 대부분의 경우합니다 (다른 지점에서) 오류 처리 루틴은 exit를 호출 또는 PHP는 보석을 수있는 치명적인 오류가 발생합니다.
두 줄의 디버그 출력을 추가하여 스크립트가 else 분기에 들어가고 나가는 지 확인합니다 (성공적으로).

while(the loop is valid){ 
    [...] 
     } else { 
      error_log('Debug: Send() failed. Start error handling'); 
      ..Mark as failure in database.. 
      usleep(10000); 
      error_log('Debug: Send() failed. End error handling'); 
     } 
    [...] 
+0

Nope. 스크립트는 실패 루틴에도 들어 가지 않습니다. 간단히 종료됩니다. 브라우저에서 같은 스크립트를 실행 해 보았습니다. false 일 때, 실패 루틴을 처리하고 루프로 계속 이동합니다. 브라우저에서 페이지를 호출 할 때 발생하는 문제는 php.ini에서 지정한 것과 상관없이 지정된 시간 초과 후 IIS가 모든 고속 CGI를 중지한다는 것입니다.따라서 전체 이메일 목록이 전송되지 않습니다. – Nirmal

+0

xdebug 및 netbeans와 같은 디버거를 프론트 엔드로 사용하여 코드를 단계별로 실행할 수 있습니다. – VolkerK