我有一项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%的时间成功,并且偶尔会失败,但是它经常发生,因此提示了这个问题。
答案 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秒钟后重试,然后放弃。根据需要调整这些阈值。