PHP连接数据库慢主要因连接方式、配置或架构不合理,优化需减少连接开销。1. 使用PDO持久连接(PDO::ATTR_PERSISTENT => true)避免重复握手;2. 单请求内复用连接,禁止循环中频繁连接;3. 确保Web与数据库服务器同内网部署,降低网络延迟;4. 调整MySQL的wait_timeout、max_connections参数;5. 在Swoole等常驻内存环境使用连接池,如Hyperf或EasySwoole框架内置池化机制;6. 可引入ProxySQL类代理实现连接复用。传统FPM推荐持久连接,高性能场景建议迁移到Swoole协程+连接池方案。
PHP连接数据库慢,通常不是代码本身的问题,而是连接方式、配置或架构不合理导致的。要提升性能,关键在于减少连接开销、复用连接资源,并合理使用连接池机制。
每次执行数据库操作都重新建立连接,会带来明显的网络和认证延迟。可以通过以下方式优化:
PHP本身是无状态的,不原生支持连接池,但可通过外部服务或框架层实现类似效果。
普通连接与持久连接对比:
// 普通连接(每次新建)
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// 持久连接(推荐用于短生命周期FPM)
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass', [
PDO::ATTR_PERSISTENT => true
]);
注意:持久连接在PHP-FPM下受进程生命周期影响,每个Worker进程保留自己的连接,适合并发不高但请求频繁的场景。
使用Swoole协程配合连接池:
use Swoole\Coroutine\MySQL; use Swoole\Coroutine\Pool;go(function () { $pool = new class extends \Swoole\Coroutine\Pool { protected function createConnection(): MySQL { $client = new
MySQL(); $client->connect([ 'host' => '127.0.0.1', 'user' => 'test', 'password' => 'test', 'database' => 'test' ]); return $client; } };
$conn = $pool->get(); $result = $conn->query('SELECT * FROM users LIMIT 1'); echo json_encode($result); $pool->put($conn); // 归还连接});
这种方式适用于长生命周期服务,能有效控制连接数量并提升响应速度。
基本上就这些。对于传统FPM环境,优先启用持久连接并优化网络;若追求高性能,建议迁移到Swoole等协程框架,结合连接池实现质的飞跃。