2024 年 PHP 日本大会

mysqli 扩展和持久连接

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

与 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 扩展支持持久连接。

添加注释

用户贡献的注释

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