mysqli_close()在php 8.5.5中仍有效,但仅适用于mysqli_connect()创建的过程化连接;对new mysqli()创建的对象必须用$conn->close(),否则报错“expects parameter 1 to be mysqli, object given”。

PHP 8.5.5 中数据库连接资源不会自动关闭,必须显式释放;否则在长生命周期脚本(如 Swoole、协程服务)中会快速耗尽连接数或触发 MySQL 的 max_connections 限制。
mysqli_close() 在 PHP 8.5.5 中是否还有效?
有效,但仅适用于过程化风格的连接。对象化风格必须用 $connection->close(),不能混用。
-
mysqli_close($conn)只接受由mysqli_connect()返回的资源型连接,对new mysqli()创建的对象会报 Warning:“mysqli_close(): expects parameter 1 to be mysqli, object given” - 对象化风格下,
$conn->close()是唯一正确方式;调用后$conn对象仍存在,但内部 socket 已断开,后续调用query()会抛出致命错误 - PHP 8.5.5 没有改变该行为,只是强化了类型提示和错误信息的清晰度
PDO 连接为什么不能用 close() 方法?
PDO 实例没有 close() 方法,官方明确不提供该接口;试图调用 $pdo->close() 会触发 Fatal error: Uncaught Error: Call to undefined method PDO::close()。
- 正确做法是将 PDO 实例设为
null或让其超出作用域,触发引用计数归零,底层连接随之释放 - 若需立即释放(比如循环中创建大量连接),推荐:
$pdo = null;,而不是依赖 GC 延迟回收 - 注意:PDO 构造时若启用了持久连接(
PDO::ATTR_PERSISTENT => true),设为null并不会真正断开物理连接,而是归还给连接池——这是预期行为,不是 bug
协程环境下忘记关闭连接会怎样?
在 PHP 8.5.5 + 协程(如 Swoole 5.x / OpenSwoole)中,未关闭的连接会持续占用 fd 和内存,且不会随协程退出自动清理,极易引发 Too many connections 或 Cannot assign requested address 错误。
- 协程不是进程,
__destruct()不会在协程结束时可靠触发,不能依赖析构函数关连接 - 必须在业务逻辑末尾显式调用
$conn->close()或$pdo = null;建议配合try/finally确保异常路径也释放 - 若使用连接池(如 Hyperf 的
ConnectionPool),则不应手动关连接,而应调用$pool->release($conn)归还——这点常被忽略
最易被忽略的是:PDO 持久连接设为 null 后看似“关闭”,实则连接仍在池中复用;而 mysqli 对象调用 close() 后,即使复用同一变量名重新赋值,也不会复用旧连接——两者的语义差异直接影响连接泄漏排查思路。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











