php数据库连接需显式关闭或确保变量销毁,否则引发连接超限、内存泄漏;mysqli需mysqli_close()或对象销毁,pdo依赖持久连接设置,长生命周期环境须严格管理连接复用与释放。

PHP 中数据库连接资源不会自动释放,必须显式关闭或让变量超出作用域,否则可能引发连接数超限、内存泄漏或服务端连接堆积等问题。
MySQLi 连接需手动关闭
使用 mysqli_connect() 或面向对象方式创建连接后,连接资源会持续占用,直到调用 mysqli_close() 或对象被销毁。脚本结束时 PHP 会尝试回收,但不可依赖此行为,尤其在长生命周期脚本(如 CLI 或 Swoole)中。
- 过程式写法:获取连接后,在业务逻辑结束前调用 mysqli_close($conn)
- 面向对象写法:可调用 $mysqli->close();若未调用,当 $mysqli 变量被 unset 或离开作用域时,析构函数会自动关闭(前提是未开启持久连接)
- 注意:启用 mysqli.reconnect=On 并不能替代主动关闭,仅影响连接异常中断后的重连行为
PDO 连接同样需要关注生命周期
PDO 实例本身不自动关闭底层连接,其行为取决于是否启用了持久连接(PDO::ATTR_PERSISTENT)。非持久连接在 PDO 对象销毁时由析构函数关闭;持久连接则被复用并保留在连接池中,不随对象销毁而关闭。
- 建议显式调用 $pdo = null 或 unset($pdo),确保及时触发析构
- 避免在循环中反复 new PDO,应复用连接实例;若必须新建,务必及时释放旧实例
- 检查连接状态可用 $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS),但该值仅作参考,不反映实际网络连接是否存活
事务与长查询场景更需谨慎
开启事务后未提交/回滚,或执行长时间运行的查询(如大数据导出),会导致连接一直被占用,阻塞其他请求。此时即使脚本逻辑结束,若未正确结束事务或未释放句柄,连接可能滞留。
PHP5学习对象教程由美国人古曼兹、贝肯、瑞桑斯编著,简张桂翻译,电子工业出版社于2007年12月1日出版的关于PHP5应用程序的技术类图书。该书全面介绍了PHP 5中的新功能、编程方法及设计模式,还分析阐述了PHP 5中新的数据库连接处理、错误处理和XML处理等机制,帮助读者系统了解、熟练掌握和高效应用PHP。
立即学习“PHP免费学习笔记(深入)”;
- 始终在 try-catch 后用 finally 块确保 commit()/rollback() 和连接释放
- 对大结果集,优先使用 fetch() 而非 fetchAll(),避免内存溢出间接延长连接占用时间
- 可通过 MySQL 的 SHOW PROCESSLIST 观察连接状态,重点关注 Sleep 状态且 Time 值过大的连接
连接池与现代运行环境的影响
在 Swoole、RoadRunner 等常驻内存环境中,全局或静态 PDO/MySQLi 实例不会随 HTTP 请求结束而销毁,连接将长期存在。此时必须严格管理连接复用与重置逻辑。
- 避免在 Worker 启动时一次性初始化数据库连接并复用到底;应结合连接健康检测(如简单 SELECT 1)和超时重连机制
- 使用连接池组件(如 Swoole\Coroutine\MySQL)时,借出连接后必须归还,否则池内连接数会逐渐耗尽
- CLI 脚本中若使用 fork 或多进程,需注意子进程会继承父进程的连接文件描述符,应 fork 后立即关闭无用连接
不复杂但容易忽略。关键不是“会不会释放”,而是“什么时候释放、由谁释放、是否真的释放了”。










