Docker环境下PHP-MongoDB出现AuthenticationAbandoned认证弃用错误排查
MongoDB
AuthenticationAbandoned: Overridden by new authentication session 错误解决(Docker+Yii2环境) 错误原因分析
- PHP-FPM多进程连接冲突:PHP-FPM采用多进程模型,每个子进程会独立发起MongoDB连接请求。当旧进程的认证流程未完成时,新进程的认证请求会覆盖旧会话,触发
AuthenticationAbandoned日志。如果Yii2未正确配置连接池,每次请求都创建新连接,叠加FPM进程的频繁启停/复用,会进一步加剧这个问题。 - 认证超时配置过短:MongoDB默认
authenticationTimeoutMillis为10秒,Docker容器间网络存在微小延迟时,部分连接的认证流程可能超时,被后续新的认证请求打断。 - Yii2连接配置疏漏:未启用长连接或连接池,导致每次请求都重新发起认证;代码中频繁创建独立连接实例,而非复用全局连接,也会引发重复认证冲突。
解决方案
1. 优化Yii2 MongoDB连接配置
在config/web.php或config/main.php中调整MongoDB组件参数,启用连接池与长连接,匹配PHP-FPM进程数:
'components' => [ 'mongodb' => [ 'class' => '\yii\mongodb\Connection', 'dsn' => 'mongodb://your_user:your_pass@mongo_container:27017/your_db', 'options' => [ 'poolSize' => 15, // 建议等于PHP-FPM的pm.max_children值 'connectTimeoutMS' => 15000, // 延长连接超时 'socketTimeoutMS' => 30000, 'keepAlive' => true, // 启用长连接 ], ], ]
2. 调整PHP-FPM进程管理参数
修改PHP-FPM配置文件(如www.conf),减少进程频繁创建销毁:
pm = dynamic pm.max_children = 15 pm.start_servers = 5 pm.min_spare_servers = 3 pm.max_spare_servers = 8
重启PHP-FPM容器使配置生效。
3. 修改MongoDB认证参数
在MongoDB容器启动命令中,延长认证超时并指定兼容的认证机制:
mongod --auth \ --setParameter authenticationTimeoutMillis=30000 \ --setParameter authenticationMechanisms=SCRAM-SHA-256
如果使用docker-compose.yml,则在command字段添加:
services: mongo: image: mongo:latest command: mongod --auth --setParameter authenticationTimeoutMillis=30000 --setParameter authenticationMechanisms=SCRAM-SHA-256 # 其他配置...
4. 优化代码中的连接复用
- 全局复用
Yii::$app->mongodb连接实例,避免在业务代码中重复创建新的Connection对象。 - 在应用的
afterRequest事件中添加连接回收逻辑,确保连接归还到池:
// 在config/web.php的bootstrap中添加 'bootstrap' => [ function ($app) { $app->on(\yii\web\Application::EVENT_AFTER_REQUEST, function () use ($app) { if ($app->has('mongodb')) { $app->mongodb->close(); // 触发连接池回收 } }); }, ],
5. 优化Docker网络
创建专用网桥用于容器间通信,减少默认bridge网络的波动:
docker network create mongo-php-network
启动容器时指定该网络(如docker-compose.yml中添加networks字段):
networks: default: external: name: mongo-php-network
内容的提问来源于stack exchange,提问作者Dumka
相关产品推荐
相关产品推荐

