2010-02-08 2 views
1

Я запускаю сценарий цикла в командной строке PHP, который отправляет электронные письма клиентам, использующим PHPMailer. Проблема, которую я получаю, заключается в том, что скрипт командной строки выходит, когда PHPMailer возвращает false.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.. 
} 

Если $mail->Send() возвращает ложь, скрипт останавливается и выходит. Является ли это ожидаемым поведением PHP в командной строке? Если это так, есть ли способ сказать PHP не останавливаться, когда он получает ложь?

Благодарим за помощь.

+2

Вы уверены, что send() является причиной выхода? Это также может быть тайм-аут сценария или ошибка в состоянии вашего цикла while. – Thirler

+0

Мои тесты показывают, что сценарий завершается только тогда, когда он встречает часть отказа в цикле. – Nirmal

+0

Вы запустили скрипт с error_reporting = E_ALL и display_errors = true (или следите за ошибкой.log)? – VolkerK

ответ

2

Я бы предположил, что функция $mail->Send() (или что-то еще полностью) вызывает ошибку, которая останавливает выполнение вашего скрипта.

Я принимаю его, значения не обновляются в базе данных? Это будет так, если да. Запустите сценарий с сообщением об ошибках, чтобы определить это.

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

Да! Значения не обновляются в базе данных. Я запускаю сообщение об ошибке, но никаких подсказок не возвращается. – Nirmal

+0

В руководстве PHPMailer написано: 'Send()' создает сообщение и назначает Mailer. Если сообщение не отправлено успешно, оно возвращает false. Используйте переменную ErrorInfo, чтобы просмотреть описание ошибки. Возвращает true при успехе, false при ошибке. – Nirmal

+0

PHPMailer может пытаться заставить замолчать сбои с помощью '@' супрессора, но если это фатальная ошибка, он выйдет независимо. –

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

Нет. Сценарий даже не входит в процедуру сбоя. Он просто выходит. Я попробовал запустить тот же скрипт из браузера, и он сработал! В поле false он обработал процедуру сбоя и перешел к циклу. Проблема с вызовом страницы в браузере заключается в том, что IIS останавливает любой быстрый CGI после указанного таймаута, независимо от того, что мы укажем в php.ini.Таким образом, никоим образом не отправляется весь список писем. – Nirmal

+0

Вы можете использовать отладчик, такой как xdebug и netbeans, в качестве интерфейса для прохождения кода. – VolkerK

Смежные вопросы