间歇性 PHP 警告:"imap_open(): Couldn't open stream"

Intermittent PHP warning: "imap_open(): Couldn't open stream"

我有一个 cron 作业,每 5 分钟从 gmail 帐户中提取一次电子邮件。我正在使用 ddboer/imap 库进行身份验证,但每隔一段时间(大约每 2 - 3 天一次)它就会出现连接问题。

我的代码相当基础,看起来像这样:

$server = new Server('imap.gmail.com');

try {
    $connection = $server->authenticate($username, $password);
} catch (Exception $e) {
    echo $e->getMessage();
}

失败时的输出为:

[E_WARNING] Authentication failed for user "user@example.com": imap_open(): Couldn't open stream {imap.gmail.com:993/imap/ssl/validate-cert}
imap_alerts (0):
imap_errors (1):
- Can not authenticate to IMAP server: [CLOSED] IMAP connection broken (authenticate)

由于问题是间歇性的,因此很难进行故障排除。以下常见问题已得到解决:

这里要注意的重要一点是,脚本在 +99% 的时间内成功,只是偶尔失败,但它经常发生,以至于提示了这个问题。

鉴于:

  • 您的代码几乎总是有效
  • 您正在连接到您无法控制的服务器
  • 这台服务器可能在几千公里之外,你们之间有几十个网络

我只是接受 $#i† 有时会发生,并确保您已做好准备:

$server = new Server('imap.gmail.com');

$retries = -1;
while (true) {
    try {
        $connection = $server->authenticate($username, $password);
        break;
    } catch (Exception $e) {
        if ($retries++ > 2) {
            echo $e->getMessage();
            break;
        }
        sleep(pow(2, $retries));
    }
}

所以如果出现错误,这将在 1 秒后重试,然后在 2 秒后重试,然后在 4 秒后重试,然后放弃。根据需要调整这些阈值。