连接

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

然后,将结果参数值传递给扩展使用的客户端库。如果客户端库检测到空或未设置的参数,则它可能会默认使用库内置的值。

内置连接库默认值

如果主机值未设置或为空,则客户端库将默认在 localhost 上建立 Unix 套接字连接。如果套接字未设置或为空,并且请求了 Unix 套接字连接,则会尝试连接到 /tmp/mysql.sock 上的默认套接字。

在 Windows 系统上,客户端库将主机名 . 解释为尝试打开基于 Windows 命名管道的连接。在这种情况下,套接字参数被解释为管道名称。如果未给出或为空,则套接字(管道名称)默认为 \\.\pipe\MySQL

如果既不建立基于 Unix 域套接字的连接,也不建立基于 Windows 命名管道的连接,并且端口参数值未设置,则库将默认使用端口 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 进行重新编译扩展。

用户可以选择安全行为和最佳性能。两者都是有效的优化目标。为了方便使用,安全行为已成为默认设置,但会牺牲最大性能。

参见

添加注释

用户贡献的注释 1 条注释

xylene2301 at gmail dot com
2 年前
"主机名 localhost 具有特殊含义。它绑定到使用 Unix 域套接字。要打开到 localhost 的 TCP/IP 连接,必须使用 127.0.0.1 代替主机名 localhost."

我是否遗漏了什么,或者第一个规定不正确?
在 Windows11 上,使用 PHP 7.4 和 MySQL 8,

$conn = new mysqli("localhost", "root", "pword", "tstDB");
echo $conn->host_info . "\n";

返回
localhost 通过 TCP/IP 连接到数据库。
To Top