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