php - 间歇性 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% 的时间内成功,并且只是偶尔失败,但它经常发生,足以提示这个问题。
解决方案
鉴于:
- 您的代码几乎总是有效
- 您正在连接到您无法控制的服务器
- 这个服务器可能在几千公里之外,你们之间有几十个网络
我只是接受有时会发生 $#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 秒后重试,然后放弃。根据需要调整这些阈值。
推荐阅读
- python - 在 ArcGIS Pro 中查找点图层的中心
- java - Java socket readLine() 方法的奇怪行为
- android - 来自 /root/.pub-cache/hosted/pub.dartlang.org 包的 Flutter 调试编译错误
- c# - 尝试在服务器上运行测试解决方案时出错缺少参考
- azure - Azure 媒体服务视频索引器中是否提供多比特率选项?
- postgresql - 更新查询以增量更新值,然后循环 PostgreSQL
- python - 无法从 mac 连接到 dockerized Postgres
- python - pyqtgraph 获取鼠标下的 PlotItem
- python - 给定一个整数列表,将其拆分为 2 个列表,如果相等则返回 True,否则返回 False(如果不可能)
- github - 如何在部署步骤中使用 Github Actions 创建 dotenv 文件?