间歇性的PHP警告:“ imap_open():无法打开流”

时间:2019-05-07 16:18:01

标签: php gmail-imap

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

1 个答案:

答案 0 :(得分:3)

鉴于:

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

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