2010-02-08 89 views
1

我正在PHP命令行中運行循環腳本,該腳本使用PHPMailer將電子郵件發送給客戶。我收到的問題是,當PHPMailer返回false時,命令行腳本將退出。PHP命令行腳本在假狀態下退出

這裏是腳本的僞代碼:

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()返回false時,腳本停止並退出。這是PHP在命令行中的預期行爲嗎?如果是這樣的話,有沒有什麼辦法可以讓PHP在收到錯誤時不要停下來?

謝謝你的幫助。

+2

你確定send()是退出的原因嗎?它也可能是腳本超時或在while循環的情況下發生錯誤。 – Thirler 2010-02-08 09:48:26

+0

我的測試顯示腳本只有在遇到循環的失敗部分時纔會退出。 – Nirmal 2010-02-08 09:52:46

+0

您是否使用error_reporting = E_ALL和display_errors = true(或留意error.log)運行腳本? – VolkerK 2010-02-08 09:53:41

回答

2

我猜想$mail->Send()函數(或其他完全)正在拋出一個錯誤,正在停止腳本的執行。

我認爲數據庫中的值沒有得到更新?如果是這樣的話,情況將會如此。運行錯誤報告的腳本來確定這一點。

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

是的!數據庫中的值沒有更新。我正在運行打開的錯誤報告,但沒有提示返回。 – Nirmal 2010-02-08 10:08:25

+0

PHPMailer手冊說:Send()會創建消息並分配Mailer。如果郵件未成功發送,則返回false。使用ErrorInfo變量來查看錯誤的描述。成功時返回true,失敗時返回false。 – Nirmal 2010-02-08 10:09:51

+0

PHPMailer可能試圖用'@'抑制器來阻止失敗,但如果它是一個致命錯誤,它將不管。 – 2010-02-08 11:03:43

1

最有可能的錯誤處理程序(在else分支)調用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,它將處理失敗例程並繼續循環。我在瀏覽器中調用頁面時遇到的問題是,無論我們在php.ini中指定什麼,IIS都會在指定的超時後停止任何fast-CGI。所以,絕不會發送整個電子郵件列表。 – Nirmal 2010-02-08 10:41:30

+0

你可以使用類似的XDebug和NetBeans調試器的前端,以步執行代碼。 – VolkerK 2010-02-08 12:16:53

相關問題