PHP长连接的坑

一直以来php连接数据库使用的都是短连接,这种方式每次请求都要重新连接,其实是非常消耗资源的,为什么不使用长连接呢?长连接会带来什么问题?我们实验一下

首先将php-fpm的配置更改一下

1
pm.start_servers=4

然后在浏览器中访问连接数据库的页面,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$type = 'mysql'; //数据库类型
$db_name = 'test'; //数据库名
$host = '127.0.0.1';
$username = 'root';
$password = '123456';
$dsn = "$type:host=$host;dbname=$db_name";
echo $dsn;
try {
//建立持久化的PDO连接
$pdo = new PDO($dsn, $username, $password, array(PDO::ATTR_PERSISTENT => true));
} catch (Exception $e) {
die('连接数据库失败!');
}
$stmt = $pdo->query('SELECT * FROM user');
while ($row = $stmt->fetch()) {
echo "id=$row[0],body=$row[1]<br/>";
}
$pdo = null;
?>

通过lsof -Pni :3306监控mysql连接情况
第一访问页面,创建连接56426
第二次访问页面,并没复用连接,而是再次创建了新的连接,使用端口56428
多次刷新页面后,查看连接发现mysql连接数为4
20180709153113975762914.png
得出结论: 一个php-fpm进程保持一个mysql连接

这里就有坑了,web机器是可以水平扩展的,php-fpm进程总数很容易超过mysql连接数,当mysql连接数打满后,后续的连接就再也连接不上服务器了,而且呢大量的连接也会给mysql增加很多压力。说到这里,应该明白php长连接的问题了,这也是为什么一些网站做大后,要么换掉php,要么让php做前端的原因吧。

参考
PHP长连接的硬伤