登录

php - mysql实例与连接

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

# PHP
伊谢尔伦伊谢尔伦2154 天前482 次浏览

全部回复(2) 我要回复

  • 黄舟

    黄舟2017-04-10 15:53:56

    我思考过这个问题,如果你真正明白了什么是一个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连接建立完毕。

    回复
    0
  • 黄舟

    黄舟2017-04-10 15:53:56

    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信息的输出.

    回复
    0
  • 取消回复发送