您的位置 首页 php

php-fpm中MySQL长连接与短连接的区别

Go JAVA 都有连接池,可以复用数据库的连接,大大减少与数据库连接时的消耗,同时连接池还通过限制连接数量保护下层的数据库。

PHP-fpm 为多进程模型,进程之间共享资源非常困难,所以数据库连接是可以在进程内共享的。

my SQL 连接数据库有两种模式:短连接、长连接。

接下来我们通过实验来证明结果:

测试例子一

代码如下

connect.php

 <?php 
$dbhost = 'db';
    $dbdatabase = 'test';
    $username = 'test';
    $userpass = '12345678';
    $dsn='mysql:host='.$dbhost.';dbname='.$dbdatabase.';';
    $dbh=new PDO($dsn,$username,$userpass, [PDO::ATTR_PERSISTENT => true]);
    // $dbh=new PDO($dsn,$username,$userpass);
    $stmt=$dbh->query('SELECT id FROM im_fri');
    $row=$stmt->fetch();
    sleep(5);
    var_dump($row);
?>  

压力测试

ab -c 100 -n 100

压力测试的过程中不停地在数据库里面执行

show processlist; 查看数据库连接线程

结果如下

长连接情况下数据库连接线程

我本地的php-fpm最大数量为 5 ,红框为我执行压力测试脚本连接的数据库用户名,对比上下两个红框里面内容左侧的 Id 编号,发现是一样的。所以在长连接情况下,每个进程的所有请求 会复用数据库连接

测试例子二

代码如下

connect.php

 <?php 
$dbhost = 'db';
    $dbdatabase = 'test';
    $username = 'test';
    $userpass = '12345678';
    $dsn='mysql:host='.$dbhost.';dbname='.$dbdatabase.';';
    // $dbh=new PDO($dsn,$username,$userpass, [PDO::ATTR_PERSISTENT => true]);
    $dbh=new PDO($dsn,$username,$userpass);
    $stmt=$dbh->query('SELECT id FROM im_fri');
    $row=$stmt->fetch();
    sleep(5);
    var_dump($row);
?>  

压力测试

ab -c 100 -n 100

压力测试的过程中不停地在数据库里面执行

show processlist; 查看数据库连接线程

结果如下

短连接情况下数据库连接线程

我本地的php-fpm最大数量为 5 ,红框为我执行压力测试脚本连接的数据库用户名,对比上下两个红框里面内容左侧的 Id 编号,发现是不一样的。所以在短连接情况下,每个进程的所有请求 不会复用数据库连接

官方解释

mysql_pconnect() 和 mysql_connect() 非常相似,但有两个主要区别。

首先,当连接的时候本函数将先尝试寻找一个在同一个主机上 同一个进程中 用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。

其次,当脚本执行完毕后到 SQL 服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的连接)。

此种连接称为“持久的”。

上面红色部分的字个人觉得加上去描述得更准确。

综上所述

短连接每次请求结束之后就会自动关闭连接。

长连接在php-fpm生命周期之内只会生成一次,之后该php-fpm进程接收的请求都会复用该数据库长连接。

疑问

最后再向大家抛出一个疑问:

如果php-fpm的数量为200,MySQL数据库的连接线程最大设置为150,这种情况下会出现什么问题。如果php程序连接失败重试又会产生什么结果呢?

文章来源:智云一二三科技

文章标题:php-fpm中MySQL长连接与短连接的区别

文章地址:https://www.zhihuclub.com/78760.shtml

关于作者: 智云科技

热门文章

网站地图