间歇性 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)
由于问题是间歇性的,因此很难进行故障排除。以下常见问题已得到解决:
- Less Secure Apps 已经 enabled/allowed
- Display Unlock Captcha已完成
- 凭据、端口和端点都正确
- 我的服务器网络在连接失败期间没有遇到连接问题
这里要注意的重要一点是,脚本在 +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 秒后重试,然后放弃。根据需要调整这些阈值。
我有一个 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)
由于问题是间歇性的,因此很难进行故障排除。以下常见问题已得到解决:
- Less Secure Apps 已经 enabled/allowed
- Display Unlock Captcha已完成
- 凭据、端口和端点都正确
- 我的服务器网络在连接失败期间没有遇到连接问题
这里要注意的重要一点是,脚本在 +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 秒后重试,然后放弃。根据需要调整这些阈值。