MySQL服务器支持使用不同的传输层进行连接。 连接可以使用TCP / IPUnix域套接字或Windows命名管道。

主机名localhost具有特殊的含义。它与Unix域套接字绑定,所以不能使用主机名localhost打开TCP / IP连接,要想打开TCP/IP的链接,只能使用127.0.0.1.

Example #1 localhost的特殊含义示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
echo $mysqli->host_info . "n"; $mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
} echo $mysqli->host_info . "n";
?>

以上例程会输出:

1
2
Localhost via UNIX socket
127.0.0.1 via TCP/IP

默认的连接参数

根据所使用的连接方法,可以省略各种参数。 如果未提供参数,扩展会尝试使用在PHP配置文件中设置的默认值.

Example #2 设置默认值

1
2
3
4
5
mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=""
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock

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

内置连接库默认值

如果主机值未设置或为空,则客户端库将默认为 大专栏  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进行设置之后重新编译扩展。

用户可以选择提升安全性或者性能。 两者都是有效的优化目标。 为了易于使用,牺牲性能,而将安全性设为默认。

PHP manual-mysqli-connections-翻译的更多相关文章

  1. Manual——Test (翻译1)

    LTE Manual ——Logging(翻译) (本文为个人学习笔记,如有不当的地方,欢迎指正!) 1.17.3 Testing framework(测试框架)   ns-3 包含一个仿真核心引擎. ...

  2. LTE Manual ——Logging(翻译)

    LTE Manual ——Logging(翻译) (本文为个人学习笔记,如有不当的地方,欢迎指正!) 9 Logging   ns-3 日志功能可以用于监测或调试仿真程序的进展.日志输出可以通过 ma ...

  3. Windows使用MySQL数据库管理系统中文乱码问题

    声明:本文关于MySQL中文乱码问题的解决方案均基于Windows 10操作系统,如果是Linux系统会有较多不适用之处,请谨慎参考. 一.MySQL中文乱码情况 1. sqlDevelper远程登陆 ...

  4. gcc都做了什么优化

    直接上程序: setjmp和longjmp是处理函数嵌套调用的,goto语句不能跨越函数,所以不选择goto. #include <setjmp.h> int setjmp(jmp_buf ...

  5. 【Android】给Android Studio设置代理

    先打开我们的Android Studio,点击工具栏的file下的settings,如下图 之后再搜索框上面输入Proxy,然后按第四步提示点击,如下图 之后就进入了设置代理的界面了,如下图 默认情况 ...

  6. android studio设置代理更新

    我们都知道Android Studio是基于IDEA开发的,而我们写的每一个程序又都是有Gradle构建的,Gradle的优点可以说是很多,被很多程序员夸得没边,但是它有一个特点还是值得我们注意的.我 ...

  7. 一文带你了解 Spring 5.0 WebFlux 应用场景

    一.什么是 Spring WebFlux 下图截自 Spring Boot 官方网站: 结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们 ...

  8. Spring Boot 2.0 WebFlux 教程 (一) | 入门篇

    目录 一.什么是 Spring WebFlux 二.WebFlux 的优势&提升性能? 三.WebFlux 应用场景 四.选 WebFlux 还是 Spring MVC? 五.异同点 六.简单 ...

  9. Android Studio设置代理,解决检查更新gradle信息的问题

    Android Studio是基于JetBrains公司的IDEA开发的,Android Studio里的项目都是由Gradle构建的,Gradle集合了Ant和Maven的优点,又解决了他们的缺点, ...

  10. 【MVC】Spring WebFlux

    一.什么是 Spring WebFlux 下图截自 Spring Boot 官方网站: 结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们 ...

随机推荐

  1. 静态代码检测CppCheck的使用

    CppCheck的官网下载地址:http://cppcheck.sourceforge.net/ 使用方法有两种: 一:以VS插件的形式使用 二:直接使用客户端界面的GUI,来进行检测 第二种方法忽略 ...

  2. 编译原理_P1003

    1. 语法分析 1.1 上下文无关文法的定义 ----  正规式能定义一下简单的语言,能表示给定结构的固定次数的重复或者没有指定次数的重复 例如:a(ba)5,a(ba)* ---- 正规式不能用于描 ...

  3. 项目课 day01

    ## 电商 ### 定义 指在互联网(Internet).内部网(Intranet)和增值网(VAN,Value Added Network)上以电子交易方式进行交易活动和相关服务活动 ### 电商的 ...

  4. redis day02 下

    位图:是二进制数据(0101101010)2^32 强势点: 01_login :101110(比如:第一天登录,二天没登录) 传统的字符串解决方案中 记录用户登录日期  统计堪忧 01_login_ ...

  5. 5)关于CSS和js静态文件引入路径

    (1)参考资料   thinkphp5手册      视图--->输出替换 (2)方法(1)在我们的application中,找到config.php,在里面输入这样的配置: <?php ...

  6. J. Stone game(背包问题)

    题:https://nanti.jisuanke.com/t/41420 定义 dp[x][y] 表示第 x 个数到最后一个数能组成和为 y 的方案数 #include<bits/stdc++. ...

  7. q检验|新复极差法|LSD|二因素方差分析

    生物统计与实验设计 放大程度q检验:精度较高>新复极差法:各种错误比较平均>LSD 其中,LSD不随M的变化而变化,但是SSR和q-test会随M变化而变化. 第一步代表了方差分析的核心思 ...

  8. github傻瓜的食用方法

    配置Git 首先在本地创建ssh key: 1 $ ssh-keygen -t rsa -C "your_email@youremail.com" 后面的your_email@yo ...

  9. GPIO-FPGA架构

    GPIO是一种软件运行期间能够动态配置和控制的通用引脚 有不同的GPIObank,每个GPIO口的bank都会有编号的区分, 每个GPIO口除了通用的输入输出功能以外,还有其他复用功能,例如GPIO5 ...

  10. 树状数组 hdu2689 hdu2838

    题意:给定一个正整数n,和一个1-n的一个排列,每个数可以和旁边的两个数的任意一个交换,每交换一次总次数就要加一,问将这个排列转换成一个递增的排列需要多少次交换? 题意可以转换成求这个排列的逆序对数. ...