持久连接背后的理念是,客户端进程和数据库之间的连接可以被客户端进程重复使用,而不是多次创建和销毁。这减少了每次需要连接时创建新连接的开销,因为未使用的连接被缓存并随时准备重复使用。
与 mysql 扩展不同,mysqli 没有提供单独的函数来打开持久连接。要打开持久连接,您必须在连接时在主机名之前添加 p:
。
持久连接的问题在于,它们可能被客户端进程以不可预测的状态留下。例如,表锁定可能在客户端意外终止之前被激活。重复使用此持久连接的新客户端进程将获得 原样
的连接。任何清理都需要由新客户端进程完成,才能有效地使用持久连接,从而增加了程序员的负担。
然而,mysqli
扩展的持久连接提供了内置的清理处理代码。由 mysqli
执行的清理包括
回滚活动事务
关闭并删除临时表
解锁表
重置会话变量
关闭预处理语句(始终与 PHP 一起发生)
关闭处理程序
释放使用 GET_LOCK() 获取的锁
这确保了持久连接在从连接池返回之前处于干净状态,供客户端进程使用。
mysqli
扩展通过自动调用 C-API 函数 mysql_change_user()
来完成此清理操作。
但是,自动清理功能有优点和缺点。优点是程序员不再需要担心添加清理代码,因为它会自动调用。但是,缺点是代码可能会稍微慢一点,因为执行清理的代码需要在每次从连接池返回连接时运行。
可以通过使用定义了 MYSQLI_NO_CHANGE_USER_ON_PCONNECT
的 PHP 编译来关闭自动清理代码。
注意:
mysqli
扩展在使用 MySQL 本地驱动程序或 MySQL 客户端库时支持持久连接。