PHP如何在SendMail上捕获DeadlineExceededError以继续执行脚本

时间:2015-11-09 16:43:57

标签: php google-app-engine exception-handling

我已经设置了一个每天在Google App Engine上运行的脚本。它从数据库中获取数据,并在循环中检查该数据,如果满足某些条件,它将向已定义的电子邮件地址发送电子邮件,该电子邮件地址在获取其他数据时获得。在极少数情况下,会发生此截止日期错误:

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
    }
}

允许我处理它,但是这是一个与Timing out相关的AppEngine异常,它听起来像是一个Try块可以处理的。那么,它只是一个常规异常,上面的代码可以保证在发生此错误时执行完整循环吗?

2 个答案:

答案 0 :(得分:1)

DeadlineExceededError class扩展错误而不是异常。您需要使用set_error_handler来设置将处理代码放入的函数。

答案 1 :(得分:1)

事实证明,没有办法直接处理此错误。毕竟这是一个致命错误,因此一旦发生这种情况,脚本将始终停止。然而,有一个特定于App Engine的解决方法,我正在寻找,Push Queues。它们允许以异步方式在单独的脚本中发送电子邮件而不进行回复(即发即弃式)。通过执行此操作,致命错误发生在辅助脚本的隔离实例中,因此即使它发生致命错误,也只会影响该单个实例,这意味着只发送一封电子邮件。

如果要发送100封电子邮件,并且发送一封致命错误,则现在发送99封而不是20-50封,因为它位于中间。