本文目录导读:

在PHP中配置数据库连接池,主要有以下几种方式,我会从简单到复杂为你介绍:
Swoole 连接池(推荐)
Swoole 提供了内置的连接池支持,是最常用的方案:
安装 Swoole
pecl install swoole
配置连接池
<?php
use Swoole\Database\PDOPool;
use Swoole\Database\PDOConfig;
// 创建连接池配置
$pool = new PDOPool(
(new PDOConfig())
->withHost('127.0.0.1')
->withPort(3306)
->withDbName('test')
->withCharset('utf8mb4')
->withUsername('root')
->withPassword('password')
->withOptions([
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]),
$size = 10 // 连接池大小
);
// 使用连接
$conn = $pool->get();
try {
$stmt = $conn->query('SELECT * FROM users');
$result = $stmt->fetchAll();
} finally {
$pool->put($conn); // 归还连接
}
Hyperf 框架连接池
如果你使用 Hyperf 框架,配置更简单:
配置文件 config/autoload/databases.php
<?php
return [
'default' => [
'driver' => 'pdo',
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'test',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'pool' => [
'min_connections' => 5, // 最小连接数
'max_connections' => 30, // 最大连接数
'connect_timeout' => 10, // 连接超时
'wait_timeout' => 3, // 等待超时
'heartbeat' => -1, // 心跳检测
'max_idle_time' => 60, // 最大空闲时间
],
'options' => [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
],
],
];
Workerman 连接池
使用 Workerman 的 MySQL 连接池
<?php
use Workerman\MySQL\Connection;
use Workerman\Worker;
$worker = new Worker('tcp://0.0.0.0:1234');
$worker->count = 4;
// 配置连接池
$worker->onWorkerStart = function() {
global $dbPool;
$dbPool = new \Workerman\MySQL\Pool(
'127.0.0.1',
'3306',
'root',
'password',
'test',
[
'min_connections' => 2,
'max_connections' => 10,
'wait_timeout' => 5
]
);
};
// 使用连接
$worker->onMessage = function($connection, $data) {
global $dbPool;
$db = $dbPool->getConnection();
$result = $db->query('SELECT * FROM users');
$connection->send(json_encode($result));
// 归还连接
$dbPool->release($db);
};
PHP-PM 连接池
PHP-PM 是一个 PHP 进程管理器,支持连接池:
安装
composer require php-pm/php-pm
配置文件 ppm.json
{
"bridge": "PdoBridge",
"host": "127.0.0.1",
"port": 8080,
"workers": 4,
"concurrency": 100,
"database": {
"host": "127.0.0.1",
"port": 3306,
"database": "test",
"username": "root",
"password": "password",
"charset": "utf8mb4",
"pool_size": 10
}
}
手动实现简单连接池
如果你不想使用框架,可以自己实现:
<?php
class ConnectionPool {
private $pool = [];
private $maxSize;
private $config;
public function __construct($config, $maxSize = 10) {
$this->config = $config;
$this->maxSize = $maxSize;
}
public function getConnection() {
if (!empty($this->pool)) {
return array_pop($this->pool);
}
if (count($this->pool) < $this->maxSize) {
return $this->createConnection();
}
throw new \Exception("Connection pool exhausted");
}
public function releaseConnection($connection) {
if (count($this->pool) < $this->maxSize) {
$this->pool[] = $connection;
} else {
$this->closeConnection($connection);
}
}
private function createConnection() {
return new PDO(
"mysql:host={$this->config['host']};port={$this->config['port']};dbname={$this->config['database']};charset={$this->config['charset']}",
$this->config['username'],
$this->config['password'],
$this->config['options'] ?? []
);
}
private function closeConnection($connection) {
$connection = null;
}
public function __destruct() {
foreach ($this->pool as $connection) {
$this->closeConnection($connection);
}
$this->pool = [];
}
}
// 使用
$config = [
'host' => '127.0.0.1',
'port' => 3306,
'database' => 'test',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8mb4',
];
$pool = new ConnectionPool($config, 10);
$conn = $pool->getConnection();
// 使用连接...
$pool->releaseConnection($conn);
使用 Laravel 的数据库连接池
Laravel 默认使用持久连接,但可以通过配置实现连接池:
config/database.php
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
'options' => [
PDO::ATTR_PERSISTENT => true, // 启用持久连接
],
],
],
建议与注意事项
- 生产环境推荐:使用 Swoole 或 Hyperf 的连接池
- 连接池大小:一般设置为
CPU核心数 * 2 + 1 - 心跳检测:定期检查连接有效性,避免使用已断开的连接
- 超时设置:合理设置连接超时和等待超时
- 监控:监控连接池的使用情况,避免连接泄漏
选择哪种方式主要取决于你的项目框架和环境需求,对于新项目,推荐使用 Swoole 或 Hyperf;对于现有项目,可以考虑手动实现简单的连接池。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播