mysqli 扩展和持久连接

持久连接背后的理念是,客户端进程和数据库之间的连接可以被客户端进程重复使用,而不是多次创建和销毁。这减少了每次需要连接时创建新连接的开销,因为未使用的连接被缓存并随时准备重复使用。

与 mysql 扩展不同,mysqli 没有提供单独的函数来打开持久连接。要打开持久连接,您必须在连接时在主机名之前添加 p:

持久连接的问题在于,它们可能被客户端进程以不可预测的状态留下。例如,表锁定可能在客户端意外终止之前被激活。重复使用此持久连接的新客户端进程将获得 原样 的连接。任何清理都需要由新客户端进程完成,才能有效地使用持久连接,从而增加了程序员的负担。

然而,mysqli 扩展的持久连接提供了内置的清理处理代码。由 mysqli 执行的清理包括

  • 回滚活动事务

  • 关闭并删除临时表

  • 解锁表

  • 重置会话变量

  • 关闭预处理语句(始终与 PHP 一起发生)

  • 关闭处理程序

  • 释放使用 GET_LOCK() 获取的锁

这确保了持久连接在从连接池返回之前处于干净状态,供客户端进程使用。

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

但是,自动清理功能有优点和缺点。优点是程序员不再需要担心添加清理代码,因为它会自动调用。但是,缺点是代码可能会稍微慢一点,因为执行清理的代码需要在每次从连接池返回连接时运行。

可以通过使用定义了 MYSQLI_NO_CHANGE_USER_ON_PCONNECT 的 PHP 编译来关闭自动清理代码。

注意:

mysqli 扩展在使用 MySQL 本地驱动程序或 MySQL 客户端库时支持持久连接。

添加备注

用户贡献的注释

此页面没有用户贡献的注释。
To Top