PHP持久连接与普通连接的区别
在 PHP 中,mysql_pconnect()
和 mysql_connect()
是旧版 MySQL 扩展(ext/mysql
) 中用于连接数据库的函数(该扩展已在 PHP 7.0 中被移除)。它们的核心区别在于连接的生命周期和管理方式:
1. mysql_connect()
:普通连接
- 工作方式:
- 每次调用时新建一个数据库连接。
- 脚本执行结束时自动关闭连接(除非显式调用
mysql_close()
)。
- 特点:
- 无状态:每次请求都是独立的连接。
- 资源开销:频繁请求时,重复创建/销毁连接可能增加开销。
- 并发安全:适合通用场景,连接间互不影响。
$link = mysql_connect('localhost', 'user', 'password');
mysql_select_db('dbname', $link);
// 执行查询...
mysql_close($link); // 显式关闭(非必需,脚本结束自动关闭)
2. mysql_pconnect()
:持久连接
- 工作方式:
- 尝试复用之前已建立的空闲连接(相同主机、用户、密码)。
- 脚本结束后连接保持打开,供后续请求复用。
- 特点:
- 连接池机制:减少重复建立连接的开销(TCP握手、权限验证)。
- 长期占用资源:连接不会被释放,直到进程结束或超时。
- 潜在风险:
- 连接数暴涨:若 PHP 进程(如 FPM 子进程)不重启,连接可能长期占用。
- 状态残留:前一次请求的事务、临时变量等状态可能影响后续请求(需手动重置状态)。
$plink = mysql_pconnect('localhost', 'user', 'password');
mysql_select_db('dbname', $plink);
// 执行查询...
// 脚本结束时不关闭连接!
核心区别总结
特性 | mysql_connect() | mysql_pconnect() |
---|---|---|
连接生命周期 | 脚本结束时自动销毁 | 脚本结束后保持打开,供后续复用 |
资源开销 | 每次请求新建连接,开销较大 | 复用连接,减少重复握手开销 |
适用场景 | 常规请求、短连接场景 | 高并发短任务(减少连接耗时) |
风险 | 无状态残留 | 连接泄露、状态残留(需手动清理) |
连接数限制 | 受 max_connections 影响 | 可能快速耗尽数据库连接上限 |
️ 重要注意事项
-
已废弃的扩展:
ext/mysql
扩展在 PHP 5.5 被废弃,PHP 7.0 中移除,请迁移至 MySQLi 或 PDO。 -
现代替代方案:
- MySQLi:使用
mysqli_connect()
(普通连接)或mysqli
对象(支持p:
前缀持久连接)。 - PDO:通过
PDO::ATTR_PERSISTENT => true
启用持久连接。
// PDO 持久连接示例 $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass', [PDO::ATTR_PERSISTENT => true ]);
- MySQLi:使用
-
持久连接的适用场景:
- 仅推荐在 PHP 进程常驻(如 CLI 脚本)或 连接开销极高 时使用。
- Web 场景中需配合进程管理器(如 PHP-FPM +
pm.max_requests
)定期重启释放连接。
💡 最佳实践建议
- 弃用
ext/mysql
: 使用 MySQLi 或 PDO 代替(更安全、支持预处理)。 - 慎用持久连接:
- 确保数据库配置足够的
wait_timeout
自动回收空闲连接。 - 在 PHP-FPM 中设置
pm.max_requests
定期重启子进程。
- 确保数据库配置足够的
- 连接池替代方案:
对于高性能需求,优先考虑使用 数据库中间件(如 ProxySQL)或 连接池组件(如 Java 的 HikariCP)。
📌 结论:普通连接(
mysql_connect
)简单安全;持久连接(mysql_pconnect
)可提升性能但需谨慎管理。现代开发中应迁移至 MySQLi/PDO,并根据实际场景权衡是否启用持久连接。