MySQL服务器支持使用不同的传输层进行连接。 连接可以使用TCP / IP,Unix域套接字或Windows命名管道。
主机名localhost具有特殊的含义。它与Unix域套接字绑定,所以不能使用主机名localhost打开TCP / IP连接,要想打开TCP/IP的链接,只能使用127.0.0.1.
Example #1 localhost的特殊含义示例
1 | <?php |
以上例程会输出:
1 | Localhost via UNIX socket |
默认的连接参数
根据所使用的连接方法,可以省略各种参数。 如果未提供参数,扩展会尝试使用在PHP配置文件中设置的默认值.
Example #2 设置默认值
1 | mysqli.default_host=192.168.2.27 |
然后将生成的参数值传递给扩展使用的客户端库。 如果客户端库检测到空或未设置参数,则它可能默认使用库内置值。
内置连接库默认值
如果主机值未设置或为空,则客户端库将默认为 大专栏 PHP manual-mysqli-connections-翻译localhost上的Unix套接字连接。 如果套接字未设置或为空,并且请求了Unix套接字连接,则尝试连接到/tmp/mysql.sock上的默认套接字。
在Windows系统上,主机名被客户端库解释为尝试打开基于Windows命名管道的连接。 在这种情况下,套接字参数被解释为管道名称。 如果参数没有给定或空,则套接字(管道名称)默认为.pipeMySQL。
如果基于Windows命名管道的连接或者基于Unix域套接字的连接都没有建立,并且端口参数值也未设置,则库将默认使用端口3306。
mysqlnd库和MySQL Client Library(libmysqlclient)实现了相同的逻辑来确定默认值。
连接选项
连接选项可用于在连接时执行的set init命令,或用于请求使用某个字符集。 必须在建立网络连接之前,设置连接选项。
要设置连接选项,连接操作必须分三步执行:使用mysqli_init()创建一个连接句柄,使用mysqli_options()设置所请求的选项,并建立与mysqli_real_connect()的网络连接。
连接池
mysqli扩展支持持久数据库连接,这是一种特殊的池化连接。 默认情况下,脚本打开的每个数据库连接都由用户在运行时显式关闭或在脚本结束时自动释放。 持久连接不是。 相反,连接会被放入一个池中,如果之后有使用相同的用户名,密码,套接字,端口和默认数据库连接到同一台服务器的情况,该连接就会被使用。 此种方法减少了连接的开销。
每个PHP进程都使用自己的mysqli连接池。 根据Web服务器部署模型,PHP进程可能会提供一个或多个请求。 因此,连接池中的连接可能会在之后被一个或多个脚本使用。
持久化连接
如果连接池中没有符合当前需要的连接,则mysqli将打开一个新的连接。 可以使用PHP指令mysqli.allow_persistent来启用和禁用持久连接功能。 脚本打开的连接总数可以通过mysqli.max_links进行限制。 每个PHP进程的持久连接的最大数量可以通过mysqli.max_persistent进行限制。 请注意,Web服务器可能会产生许多PHP进程。
持久连接的一个常见的抱怨是,它们的状态在重新使用之前不被重置。 例如,打开和未完成的事务不会自动回滚。 而且,将连接进入池并重新使用之间发生的授权更改也没有反映出来。 这可能被视为不必要的副作用。 相反,持久的名字可能被理解为是国家坚持的承诺(这一句不知道怎么翻了。没看懂)。
mysqli扩展同时支持对持久连接的解释:状态持续,或在重新使用前重置状态。 默认值是重置。 在持续连接被重用之前,mysqli扩展隐式调用mysqli_change_user()来重置状态。 持久连接对用户来说似乎刚刚打开。 之前的使用并不会影响当前。
mysqli_change_user()函数是一个昂贵的操作。 为获得最佳性能,用户可能希望对MYSQLI_NO_CHANGE_USER_ON_PCONNECT进行设置之后重新编译扩展。
用户可以选择提升安全性或者性能。 两者都是有效的优化目标。 为了易于使用,牺牲性能,而将安全性设为默认。