1. 云栖社区>
  2. Mysql教程>
  3. 正文

说说PHP长连接的本质是什么?

作者:用户 来源:互联网 时间:2016-08-24 13:19:53

php连接什么本质说说

说说PHP长连接的本质是什么? - 摘要: 本文讲的是说说PHP长连接的本质是什么?, 上篇博文[《PHP的CURL报错的排查记录:短连接的成本真的很高啊》](https://my.oschina.net/u/222608/blog/808708),我提到PHP长连接有个硬伤,那么硬伤到底在哪里呢。我们写一个简易的memca



上篇博文[《PHP的CURL报错的排查记录:短连接的成本真的很高啊》](https://my.oschina.net/u/222608/blog/808708),我提到PHP长连接有个硬伤,那么硬伤到底在哪里呢。
我们写一个简易的memcache客户端来分析下这个问题,数据库等扩展的长连接同理,之所以要自己写一个,是为了更加清晰的看这个问题,不被扩展什么的干扰。
```
$sock = pfsockopen("127.0.0.1",11211);
fwrite($sock,"set key 0 0 5/r/nvalue/r/n");
echo fread($sock,8);
```
然后将php-fpm的子进程数设置为4个
```
pm.max_children = 4
```
然后我们用Wireshark选择Loopback抓包看一下,Wireshark过滤表达式
```
tcp.dstport == 11211
```
结果如下
![Wireshark抓包](/2014th7cj/d/file/p/20161226/qshwr1re0w4.png "Wireshark抓包")
从抓包结果的Info栏可以看出,PHP在连续创建的4个连接后,后续的连接才开始复用前面的连接(从发起请求的端口号可以看出来)。
有没有想到什么。
PHP的长连接是存在php-fpm子进程里的,并不是很多人想的那样,一旦创建了一个长连接,后续就一直使用这一个长连接。而是每个子进程使用一个长连接,子进程之间的长连接是不共享的。
这样有什么不好吗。
假若我们的PHP应用访问量不高,并发量不大,我们只需要开启几十个php-fpm子进程,每一个子进程保持一个长连接这没什么问题。但是,如果访问量很大,我们必须开成百上千个php-fpm子进程的话,这么多的长连接将会给应用服务器带来很高的压力,比如连接MySQL使用长连接,一般MySQL数据库最大连接数也就几千
```
SHOW VARIABLES like 'max_connections';//查看MySQL最大连接数
```
想象一下,假如你有几十台PHP服务器,每台服务器都是成百上千的php-fpm子进程,一旦达到MySQL最大连接数,后续的连接就再也连不上数据库了,而且这么多的连接也会增加MySQL的压力。
说到这里,应该明白PHP长连接的硬伤了吧,也应该明白为什么一些网站做大后,要么换掉PHP,要么让PHP仅仅做前端的原因了吧。

以上是说说PHP长连接的本质是什么?的全部内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有说说PHP长连接的本质是什么?的相关内容,欢迎继续使用右上角搜索按钮进行搜索php , 连接 , 什么 , 本质 说说 ,以便于您获取更多的相关知识。