2015-11-09 71 views
0

我已經設置了一個每天在Google App Engine上運行的腳本。它從數據庫獲取數據,並在一個循環中檢查數據,如果滿足某些條件,它將發送一封電子郵件到其獲取其他數據時獲得的定義的電子郵件地址。在極少數情況下,會出現此期限錯誤:PHP如何捕獲SendMail上的DeadlineExceededError以繼續執行腳本

PHP Fatal error: Uncaught exception 'google\appengine\runtime\DeadlineExceededError' with message 'The API call  
mail.Send() took too long to respond and was cancelled.' in /base/data/home/runtimes/php/sdk/google/appengine/runtime/RealApiProxy.php:74 

什麼我尋找簡單說就是:我如何捕獲這個異常,這樣我可以用腳本執行下去?由於它被定義爲一個例外,我相信使用

foreach ($data as $key => $value) 
    //code to check if email needs to be sent 
    try { 
     //send mail code 
    } catch (Exception $e) { 
     // handling code 
    } 
} 

,讓我來對付它,但作爲這個是關係到計時出的AppEngine例外,它聽起來不是我像一個try塊可以處理。那麼,這只是一個常規異常,上面的代碼將保證發生此錯誤時執行完整循環嗎?

回答

1

事實證明,有沒有辦法直接處理這個錯誤。畢竟它是一個致命錯誤,所以一旦發生這種情況,腳本總是會停止。然而,App Engine特有的解決方法正是我所期待的,Push Queues。它們允許電子郵件以異步方式發送到一個單獨的腳本中,而不回覆(即發即棄樣式)。通過這樣做,致命錯誤發生在輔助腳本的孤立實例中,因此即使致命錯誤消失,也只會影響該單一實例,這意味着只有一個電子郵件不會發出。

如果應該發送100封電子郵件,並且發送一個致命錯誤,現在99個發送出去,而不是僅有20-50個,因爲它在中間。

+1

並且任務將重試,因此即使發生錯誤,重試後仍應發送100封電子郵件。 –