首页 > 解决方案 > 间歇性 PHP 警告:“imap_open(): 无法打开流”

问题描述

我有一个 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% 的时间内成功,并且只是偶尔失败,但它经常发生,足以提示这个问题。

标签: phpgmail-imap

解决方案


鉴于:

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

我只是接受有时会发生 $#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 秒后重试,然后放弃。根据需要调整这些阈值。


推荐阅读