PHP-fpm为多进程模型,进程之间共享资源非常困难,以是数据库连接是可以在进程内共享的。
mysql连接数据库有两种模式:短连接、长连接。
接下来我们通过实验来证明结果:
测试例子一
代码如下
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 http://localhost/connect.php
压力测试的过程中一直地在数据库里面实行
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 http://localhost/connect.php
压力测试的过程中一直地在数据库里面实行
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程序连接失落败重试又会产生什么结果呢?