有效,但仅对普通连接生效;php 8.5.5 中 mysqli_close() 仍返回 true,对持久连接(如 mysqli_pconnect() 或 real_connect() 启用 mysqli_client_persistent)完全无效,且不报错。

mysqli_close() 在 PHP 8.5.5 中是否还有效?
有效,但行为没变——mysqli_close() 仍返回 true(PHP 8.0+ 统一行为),且只对普通连接起作用。它不会报错,也不会抛异常,但对持久连接(mysqli_pconnect() 或 mysqli::real_connect() 配置了 MYSQLI_CLIENT_FOUND_ROWS 等持久标志)完全无效。
调用 mysqli_close() 前必须确认的三件事
直接调用前不检查连接类型,等于白干:
- 查代码里有没有
mysqli_pconnect()—— 有就别调mysqli_close() - 查
mysqli_init()后是否用了real_connect()并传入MYSQLI_CLIENT_PERSISTENT标志 - 查 php.ini 是否启用了
mysqli.reconnect = On(这不影响mysqli_close()行为,但会掩盖连接异常)
mysqli_close() 后连接还在?先看 MySQL 侧状态
执行 mysqli_close($conn) 返回 true ≠ 连接已断开。验证方式只有查 MySQL:
- 登录 MySQL 执行
SHOW PROCESSLIST; - 找对应
User和Host的连接,若状态是Sleep且Time持续增长,说明是持久连接或连接池未回收 - 普通连接关闭后,该行应几秒内消失;若 30 秒后还在,基本可判定是持久连接
真正释放资源:不止关连接,还要清结果集和变量
mysqli_close() 只处理连接句柄,但 mysqli_result 和语句对象才是内存泄漏主因:
- 执行
$result = mysqli_query($conn, $sql)后,必须在遍历完或取完数据后立刻调mysqli_free_result($result) - 若用了
mysqli_prepare(),执行完$stmt->execute()后,需显式$stmt = null(比unset($stmt)更可靠) - 不要依赖脚本结束自动清理——CLI 长任务、Swoole Worker、循环导出百万数据时,不手动释放,
memory_get_usage()会线性上涨直至 OOM
最易被忽略的点:PDO 用户常误以为 $pdo = null 就万事大吉,但 mysqli 下,mysqli_close() 不解决 mysqli_result 卡住内存的问题;而很多人只调 mysqli_free_result() 却忘了后续 unset 或置空,导致引用计数不降为 0,资源仍滞留。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











