如何在Lumen中使用Jessenger关闭MongoDB空闲连接?
解决Lumen+Jessenger MongoDB多连接/空闲连接问题
以下是经实践验证的可靠方案,可有效减少空闲连接、降低资源消耗:
1. 复用单例连接
在Lumen容器中绑定MongoDB连接为单例,确保每个请求周期内仅创建一次连接,而非每个API接口都新建。
在App\Providers\AppServiceProvider.php的register方法中添加:
$this->app->singleton('mongo.connection', function ($app) { $config = $app['config']->get('database.connections.mongodb'); $client = new \MongoDB\Client($config['dsn'], $config['options']); return $client->selectDatabase($config['database']); });
后续业务代码中通过app('mongo.connection')获取连接实例,替代每次手动创建新连接。
2. 请求结束主动关闭连接
通过全局中间件,在每个请求处理完成后主动关闭MongoDB连接,避免连接滞留在php-fpm进程中。
步骤1:创建中间件
新建App\Http\Middleware\CloseMongoConnection.php:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\App; class CloseMongoConnection { public function handle($request, Closure $next) { $response = $next($request); // 关闭MongoDB客户端连接 $mongoClient = App::get('mongo.connection')?->getClient(); if ($mongoClient) { $mongoClient->close(); } return $response; } }
步骤2:注册中间件
在bootstrap/app.php中注册全局中间件:
$app->middleware([ App\Http\Middleware\CloseMongoConnection::class, ]);
3. 配置MongoDB连接池
利用MongoDB驱动的连接池功能,自动复用连接、回收空闲连接,从根源减少连接创建次数。
在config/database.php的MongoDB连接配置中添加连接池参数:
'mongodb' => [ 'driver' => 'mongodb', 'dsn' => env('MONGODB_URI'), 'database' => env('MONGODB_DATABASE'), 'options' => [ 'poolSize' => 15, // 单进程最大连接数,根据服务器配置调整 'maxIdleTimeMS' => 30000, // 空闲连接超时回收时间(30秒) 'waitQueueTimeoutMS' => 1000, // 获取连接超时时间(1秒) ], ],
4. 优化php-fpm进程配置
结合连接池调整php-fpm参数,控制进程数量,避免因进程过多导致连接数爆炸。推荐使用dynamic模式,示例配置:
pm = dynamic pm.max_children = 60 pm.start_servers = 12 pm.min_spare_servers = 6 pm.max_spare_servers = 24 pm.process_idle_timeout = 15s;
实践注意事项
- 单例连接需配合请求结束关闭逻辑,避免php-fpm进程复用旧连接导致连接失效;
- 连接池
poolSize需根据MongoDB服务器的maxConnections(默认1000)调整,确保总连接数不超过MongoDB承载上限; - 压力测试前需模拟真实业务场景,验证连接数、进程数的合理性。
内容的提问来源于stack exchange,提问作者Shahid Rafiq
相关产品推荐
相关产品推荐

