当前位置: 首页 > news >正文

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 影响可能快速耗尽数据库连接上限

重要注意事项

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

  2. 现代替代方案

    • 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
    ]);
    
  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,并根据实际场景权衡是否启用持久连接。

http://www.lryc.cn/news/621423.html

相关文章:

  • 上网行为组网方案
  • Linux软件下载菜单脚本
  • 2025 年电赛 C 题 发挥部分 1:多正方形 / 重叠正方形高精度识别与最小边长测量
  • 待办事项小程序开发
  • Multimodal RAG Enhanced Visual Description
  • 容器运行时支持GPU,并使用1panel安装ollama
  • 【嵌入式C语言】四
  • 20道前端性能优化面试题精华
  • python学习DAY41打卡
  • 低配硬件运行智谱GLM-4.5V视觉语言模型推理服务的方法
  • 《WebGL中FBO的底层运行逻辑》
  • 基于ECharts和EdgeOne打造云上智能图表
  • 编排之神-Kubernetes中的微服务介绍及演练
  • (2-10-1)MyBatis的基础与基本使用
  • 大数据项目_基于Python+hadopp的城市空气污染数据关联性可视化分析系统源码_基于机器学习的城市空气污染预测与分析系统的设计与实现
  • C/C++ 进阶:深入解析 GCC:从源码到可执行程序的魔法四步曲
  • 卫星通信链路预算之七:上行载噪比计算
  • 【C#】PNG 和 JPG、JPEG的应用以及三种格式的区别?
  • [系统架构设计师]软件工程基础知识(五)
  • 《量子雷达》第5章 量子雷达发射机 预习2025.8.14
  • “Zen 5”: The AMD High-Performance 4nm x86-64 Microprocessor Core
  • 接口测试用例的编写
  • Avalonia_SukiUI明暗主题切换时部分元素颜色不变
  • vue内置组件
  • 基于wireshark的USB 全速硬件抓包工具USB Sniffer Lite的使用
  • 打靶日常-CSRF
  • pytorch学习笔记-加载现有的网络模型(VGG16)、增加/修改其中的网络层(修改为10分类)
  • 分布式锁—Redisson的公平锁
  • 如何更好地使用AI编程?
  • MySQL窗口函数与PyMySQL以及SQL注入