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


PHP How to Catch DeadlineExceededError on SendMail to continue Script execution

我已经设置了一个每天在谷歌应用引擎上运行的脚本。它从数据库中获取数据,并在一个循环中检查这些数据,如果满足某些条件,它将向一个定义的电子邮件地址发送一封电子邮件,当它获取其他数据时,它会得到该地址。在极少数情况下,会出现这种截止日期错误:

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块可以处理的异常。那么,这只是一个常规的异常吗?当这个错误发生时,上面的代码会保证执行完整的循环吗?

DeadlineExceededError类扩展了Error而不是Exception。您需要使用set_error_handler来设置将处理代码放入的函数。

事实证明,没有办法直接处理此错误。毕竟,这是一个致命错误,因此一旦发生这种情况,脚本将始终停止。然而,有一个特定于应用程序引擎的解决方案,这就是我所寻找的,推送队列。它们允许电子邮件在一个单独的脚本中异步发送,没有回复(即发即弃风格)。通过这样做,致命错误会发生在辅助脚本的一个孤立实例中,因此即使致命错误发生,也只有那个实例受到影响,这意味着只有一封电子邮件没有发送出去。

如果要发送100封电子邮件,其中一封是致命错误,那么现在发送99封,而不是只发送20-50封,因为它处于在中间。

相关文章:
  • 没有找到相关文章