MySQL 服务器支持使用不同的传输层进行连接。连接使用 TCP/IP、Unix 域套接字或 Windows 命名管道。
主机名 localhost
具有特殊含义。它绑定到 Unix 域套接字的使用。要打开到 localhost 的 TCP/IP 连接,必须使用 127.0.0.1
而不是主机名 localhost
。
示例 #1 localhost 的特殊含义
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
echo $mysqli->host_info . "\n";
$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
echo $mysqli->host_info . "\n";
以上示例将输出
Localhost via UNIX socket 127.0.0.1 via TCP/IP
连接参数默认值
根据使用的连接函数,可以省略各种参数。如果未提供参数,则扩展尝试使用 PHP 配置文件中设置的默认值。
示例 #2 设置默认值
mysqli.default_host=192.168.2.27 mysqli.default_user=root mysqli.default_pw="" mysqli.default_port=3306 mysqli.default_socket=/tmp/mysql.sock
然后将生成的 parameter 值传递给扩展使用的客户端库。如果客户端库检测到空或未设置的参数,则它可能会默认为库内置值。
内置连接库默认值
如果 host 值未设置或为空,则客户端库将默认为 localhost
上的 Unix 套接字连接。如果 socket 未设置或为空,并且请求 Unix 套接字连接,则尝试连接到 /tmp/mysql.sock
上的默认套接字。
在 Windows 系统上,客户端库将主机名 .
解释为尝试打开基于 Windows 命名管道的连接。在这种情况下,socket 参数被解释为管道名称。如果未给出或为空,则 socket(管道名称)默认为 \\.\pipe\MySQL
。
如果不建立基于 Unix 域套接字或基于 Windows 命名管道的连接,并且 port 参数值未设置,则库将默认为端口 3306
。
mysqlnd 库和 MySQL 客户端库 (libmysqlclient) 实现相同的确定默认值的逻辑。
连接选项
连接选项可用于例如设置在连接时执行的 init 命令,或请求使用特定字符集。必须在建立网络连接之前设置连接选项。
要设置连接选项,必须分三个步骤执行连接操作:使用 mysqli_init() 或 mysqli::__construct() 创建连接句柄,使用 mysqli::options() 设置请求的选项,并使用 mysqli::real_connect() 建立网络连接。
连接池
mysqli 扩展支持持久数据库连接,这是一种特殊的池化连接。默认情况下,脚本打开的每个数据库连接要么在运行时由用户显式关闭,要么在脚本结束时自动释放。持久连接不是这样。相反,它被放入一个池中以供以后重用,如果使用相同的用户名、密码、套接字、端口和默认数据库打开到同一服务器的连接。重用可以节省连接开销。
每个 PHP 进程都使用自己的 mysqli 连接池。根据 Web 服务器部署模型,一个 PHP 进程可以服务一个或多个请求。因此,一个池化连接可以随后被一个或多个脚本使用。
持久连接
如果在连接池中找不到给定主机、用户名、密码、套接字、端口和默认数据库组合的未使用持久连接,则 mysqli 会打开一个新连接。可以使用 PHP 指令 mysqli.allow_persistent 启用和禁用持久连接的使用。可以使用 mysqli.max_links 限制脚本打开的连接总数。可以使用 mysqli.max_persistent 限制每个 PHP 进程的持久连接的最大数量。请注意,Web 服务器可能会生成许多 PHP 进程。
关于持久连接的一个常见抱怨是,在重用之前不会重置其状态。例如,打开的和未完成的事务不会自动回滚。此外,在将连接放入池和重用它之间发生的身份验证更改不会反映出来。这可能被视为不希望有的副作用。相反,名称 persistent
可以理解为对状态将被持久化的承诺。
mysqli 扩展支持持久连接的两种解释:持久化状态和在重用之前重置状态。默认值为重置。在重用持久连接之前,mysqli 扩展会隐式调用 mysqli::change_user() 来重置状态。持久连接对用户来说就像刚打开一样。以前用法的任何工件都不可见。
mysqli::change_user() 调用是一个昂贵的操作。为了获得最佳性能,用户可能希望使用编译标志 MYSQLI_NO_CHANGE_USER_ON_PCONNECT
进行重新编译扩展。
用户可以选择安全行为和最佳性能。两者都是有效的优化目标。为了易用性,安全行为已成为默认值,但牺牲了最大性能。
另请参阅