php - mysql实例与连接
伊谢尔伦
伊谢尔伦 2017-04-10 15:51:56
0
2
704

1.一个mysql实例(进程)可以创建多个连接(线程)吗?
2.这里连接的概念有分物理上的连接和逻辑上的连接吗?它们和mysql实例是什么关系,是否一一对应关系?
3.php里的mysql_connect()是指创建什么连接?是物理连接吗?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

reply all(2)
黄舟

我思考过这个问题,如果你真正明白了什么是一个TCP连接,你的问题你就明白了。
第一点需要明确的是:mysql的Server实例与mysql的Client间通信是走TCP连接

好,明白了这点,现在尝试搞明白什么才是一个真正的TCP连接?

用一个四元组就可以表示一个真正的连接。
[sourceIP,sourcePort,desIP,descPort]该四元组唯一的表示一条TCP连接。

当明白这个你就知道其实一个mysql客户端进程与mysql Server直接是可以有多条TCP连接的。因为mysql客户端可以开启多个端口来连接Server端。

再会上题主的问题。当在mysql client端调用connect()方法的时候,是客户端启动一个端口与mysql Server进行TCP握手连接,三次握手完毕后TCP连接建立完毕。

黄舟

MySQL的最大连接数max_connections默认151,PHP与其建立的数据库连接都是真正的TCP连接,在PHP使用持久连接下执行下列操作可见:

sudo netstat -antp|head -n2 && 
sudo netstat -antp|egrep "php-fpm|mysqld"|grep ESTABLISHED

比如下面就是就是PHP-FPM和MySQL建立持久连接的情况:

/* 简单的ab压测MySQL连接:Ubuntu14.04,i5-3230M */
// 持久化连接的RPS为5900
$mysqli = @new mysqli('p:127.0.0.1', 'username', 'password', 'database');
// 普通连接的RPS为4200
// $mysqli = new mysqli('127.0.0.1', 'username', 'password', 'database');


上面有5个PHP-FPM工作进程.注意,PHP-FPM的进程数pm.max_children不要多于MySQL的最大连接数max_connections(默认151).
PHP-FPM进程维护的持久连接空闲时间超过wait_timeout后,页面再次执行new mysqli()会返回"MySQL server has gone away"的Warning信息,并重新建立持久连接,可以用@抑制Warning信息的输出.

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template