# mysqli 扩展和持久化连接

持久化连接的目的在于重用客户端到服务器之间的连接， 而不是每次在需要的时候都重新建立一个连接。 由于持久化连接可以将已经建立的连接缓存起来，以备后续的使用， 所以省去了建立新的连接的开销， 因此可以带来性能上的提升。

不像 mysql 扩展，mysqli 没有提供一个特殊的方法用于打开持久化连接。 需要打开一个持久化连接时，你必须在 连接时在主机名前增加`p:`。

使用持久化连接也会存在一些风险， 因为在缓存中的连接可能处于一种不可预测的状态。 例如，如果客户端未能正常关闭连接， 可能在这个连接上残留了对库表的锁， 那么当这个连接被其他请求重用的时候，这个连接还是处于 有锁的状态。 所以，如果要很好的使用持久化连接，那么要求代码在和数据库进行交互的时候， 确保做好清理工作，保证被缓存的连接是一个干净的，没有残留的状态。

`mysqli` 扩展的持久化连接提供了内建的清理处理代码。 `mysqli` 所做的清理工作包括：

- 回滚处于活动状态的事务

- 关闭并且删除临时表

- 对表解锁

- 重置会话变量

- 关闭预编译 SQL 语句（在PHP中经常发生）

- 关闭处理程序

- 释放通过 GET_LOCK() 获得的锁

这确保了将连接返回到连接池的时候， 它处于一种“干净”的状态，可以被其他客户端进程所使用。

`mysqli` 扩展 通过自动调用 C-API 函数 `mysql_change_user()` 来完成这个清理工作。

自动清理的特性有优点也有缺点。 优点是程序员不再需要担心附加的清理代码， 因为它们会自动调用。 然而缺点就是 性能 可能会 慢一点， 因为每次从连接池返回一个连接都需要执行这些清理代码。

这个自动清理的代码可以通过在编译 php 时定义 `MYSQLI_NO_CHANGE_USER_ON_PCONNECT` 来关闭。

> 注意:

> `mysqli` 扩展在使用 MySQL Native Driver 或 Mysql Client Library（libmysql）时都支持持久化连接。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open