我已经设置了一个每天在谷歌应用引擎上运行的脚本。它从数据库中获取数据,并在一个循环中检查这些数据,如果满足某些条件,它将向一个定义的电子邮件地址发送一封电子邮件,当它获取其他数据时,它会得到该地址。在极少数情况下,会出现这种截止日期错误:
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块可以处理的异常。那么,这只是一个常规的异常吗?当这个错误发生时,上面的代码会保证执行完整的循环吗?
set_error_handler
来设置将处理代码放入的函数。
事实证明,没有办法直接处理此错误。毕竟,这是一个致命错误,因此一旦发生这种情况,脚本将始终停止。然而,有一个特定于应用程序引擎的解决方案,这就是我所寻找的,推送队列。它们允许电子邮件在一个单独的脚本中异步发送,没有回复(即发即弃风格)。通过这样做,致命错误会发生在辅助脚本的一个孤立实例中,因此即使致命错误发生,也只有那个实例受到影响,这意味着只有一封电子邮件没有发送出去。
如果要发送100封电子邮件,其中一封是致命错误,那么现在发送99封,而不是只发送20-50封,因为它处于在中间。