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. visual studio2019下静态链接库的制作

    创建静态库项目 项目名称为20199324lib // pch.h #ifndef __PCH__ #define __PCH__ extern int add(int a, int b);//ext ...

  2. C# 扩张方法的语法

    using System; namespace ConsoleApp { class Program { static void Main(string[] args) { string str = ...

  3. JS中的0b00与0x00表示什么

    换成二进制表示:(0b表示二进制数,0x表示16进制数)

  4. Durandal入门

    参考:http://www.360doc.com/content/14/1223/11/13819_435123743.shtml 示例代码下载地址:http://durandaljs.com/ver ...

  5. jumpserver_跳板机实操

    首先,jumpserver是什么呢? Jumpserver 是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. 特点: 完全开 ...

  6. mui a链接的点击

    mui里面,使用click点击在有时候是无效的,或者点击的位置错位.在别处点击才有效. mui中对a的点击应该这样写: mui('body').on('tap', "#chart" ...

  7. 系统学习javaweb重点难点2--.JavaScript中的正则对象简述和正则对象使用注意事项。

    注意:只是简述,对正则对象的了解目前还不是很深刻,日后详细了解了再来修改. 正文: 正则对象 首先,我们要了解一下什么是正则对象: 正则表达式,又称规则表达式.(英语:Regular Expressi ...

  8. 第19届亚太零售商大会 | 奇点云CEO行在受邀出席发表演讲

    2019年9月5日—7日,第19届亚太零售商大会在重庆举行. 亚太零售商大会作为世界三大零售盛会之一,是亚太地区零售行业最具规模.最具影响力的零售行业盛会.本次大会以“新零售·新消费·新动力·合作与共 ...

  9. Pulsar、ZooKeeper、BookKeeper 作用简述

    Pulsar:采取了存储计算分离的技术ZooKeeper 集群的作用和在 Kafka 中是一样的,都是被用来存储元数据.BookKeeper 集群则被用来存储消息数据.BookKeeper 有点儿类似 ...

  10. 吴裕雄--天生自然python学习笔记:python实现自动网页测试

    Python 可实现的网页测试的功能十分强大,甚至能通 过编程来实现让绝大多数的测试过程自动化. 这对很多开 发者来说,绝对是不可多得的神器. hash lib 纽件可以判别文件是否有过更改,只需要用 ...