PHP持久连接与普通连接的区别

在 PHP 中,mysql_pconnect()mysql_connect()旧版 MySQL 扩展(ext/mysql 中用于连接数据库的函数(该扩展已在 PHP 7.0 中被移除)。它们的核心区别在于连接的生命周期和管理方式:


1. mysql_connect():普通连接

  • 工作方式
    • 每次调用时新建一个数据库连接
    • 脚本执行结束时自动关闭连接(除非显式调用 mysql_close())。
  • 特点
    • 无状态:每次请求都是独立的连接。
    • 资源开销:频繁请求时,重复创建/销毁连接可能增加开销。
    • 并发安全:适合通用场景,连接间互不影响。
php 复制代码
$link = mysql_connect('localhost', 'user', 'password');
mysql_select_db('dbname', $link);
// 执行查询...
mysql_close($link); // 显式关闭(非必需,脚本结束自动关闭)

2. mysql_pconnect():持久连接

  • 工作方式
    • 尝试复用之前已建立的空闲连接(相同主机、用户、密码)。
    • 脚本结束后连接保持打开,供后续请求复用。
  • 特点
    • 连接池机制:减少重复建立连接的开销(TCP握手、权限验证)。
    • 长期占用资源:连接不会被释放,直到进程结束或超时。
    • 潜在风险
      • 连接数暴涨:若 PHP 进程(如 FPM 子进程)不重启,连接可能长期占用。
      • 状态残留:前一次请求的事务、临时变量等状态可能影响后续请求(需手动重置状态)。
php 复制代码
$plink = mysql_pconnect('localhost', 'user', 'password');
mysql_select_db('dbname', $plink);
// 执行查询...
// 脚本结束时不关闭连接!

核心区别总结

特性 mysql_connect() mysql_pconnect()
连接生命周期 脚本结束时自动销毁 脚本结束后保持打开,供后续复用
资源开销 每次请求新建连接,开销较大 复用连接,减少重复握手开销
适用场景 常规请求、短连接场景 高并发短任务(减少连接耗时)
风险 无状态残留 连接泄露、状态残留(需手动清理)
连接数限制 max_connections 影响 可能快速耗尽数据库连接上限

重要注意事项

  1. 已废弃的扩展
    ext/mysql 扩展在 PHP 5.5 被废弃PHP 7.0 中移除 ,请迁移至 MySQLiPDO

  2. 现代替代方案

    • MySQLi :使用 mysqli_connect() (普通连接)或 mysqli 对象(支持 p: 前缀持久连接)。
    • PDO :通过 PDO::ATTR_PERSISTENT => true 启用持久连接。
    php 复制代码
    // PDO 持久连接示例
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass', [
        PDO::ATTR_PERSISTENT => true
    ]);
  3. 持久连接的适用场景

    • 仅推荐在 PHP 进程常驻 (如 CLI 脚本)或 连接开销极高 时使用。
    • Web 场景中需配合进程管理器(如 PHP-FPM + pm.max_requests)定期重启释放连接。

💡 最佳实践建议

  • 弃用 ext/mysql : 使用 MySQLiPDO 代替(更安全、支持预处理)。
  • 慎用持久连接
    • 确保数据库配置足够的 wait_timeout 自动回收空闲连接。
    • 在 PHP-FPM 中设置 pm.max_requests 定期重启子进程。
  • 连接池替代方案
    对于高性能需求,优先考虑使用 数据库中间件 (如 ProxySQL)或 连接池组件(如 Java 的 HikariCP)。

📌 结论 :普通连接(mysql_connect)简单安全;持久连接(mysql_pconnect)可提升性能但需谨慎管理。现代开发中应迁移至 MySQLi/PDO,并根据实际场景权衡是否启用持久连接。