有效,但仅对普通连接生效;PHP 8.5.5 中 mysqli_close() 仍返回 true,对持久连接(如 mysqli_pconnect() 或 real_connect() 启用 MYSQLI_CLIENT_PERSISTENT)完全无效,且不报错。
有效,但行为没变——mysqli_close() 仍返回 true(PHP 8.0+ 统一行为),且只对普通连接起作用。它不会报错,也不会抛异常,但对持久连接(mysqli_pconnect() 或 mysqli::real_connect() 配置了 MYSQLI_CLIENT_FOUND_ROWS 等持久标志)完全无效。
直接调用前不检查连接类型,等于白干:
mysqli_pconnect() —— 有就别调 mysqli_close()
mysqli_init() 后是否用了 real_connect() 并传入 MYSQLI_CLIENT_PERSISTENT 标志mysqli.reconnect = On(这不影响 mysqli_close() 行为,但会掩盖连接异常)执行 mysqli_close($conn) 返回 true ≠ 连接已断开。验证方式只有查 MySQL:
SHOW PROCESSLIST;
User 和 Host 的连接,若状态是 Sleep 且 Time 持续增长,说明是持久连接或连接池未回收mysqli_close() 只处理连接句柄,但 mysqli_result 和语句对象才是内存泄漏主因:
立即学习“PHP免费学习笔记(深入)”;
$result = mysqli_query($conn, $sql) 后,必须在遍历完或取完数据后立刻调 mysqli_free_result($result)
mysqli_prepare(),执行完 $stmt->execute() 后,需显式 $stmt = null(比 unset($stmt) 更可靠)memory_get_usage() 会线性上涨直至 OOM最易被忽略的点:PDO 用户常误以为 $pdo = null 就万事大吉,但 mysqli 下,mysqli_close() 不解决 mysqli_result 卡住内存的问题;而很多人只调 mysqli_free_result() 却忘了后续 unset 或置空,导致引用计数不降为 0,资源仍滞留。