上篇博文《PHP的CURL报错的排查记录:短连接的成本真的很高啊》,我提到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

结果如下

从抓包结果的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、GO相关踩坑实践技巧请关注我的公众号:PHP架构师

php-fpm mysql 长连接_分析:PHP长连接的硬伤相关推荐

  1. navicat远程连接mysql很慢_解决Navicat远程连接mysql很慢的方法

    ubuntu 下 /etc/mysql/mysql.conf.d [mysqld] skip-name-resolve  增加该字段即可 如果增加该字段,这无法使用本地ip进行登入, 登陆到MySql ...

  2. jsp和mysql答辩_如何应对JSP连接MySQL数据库问题_网站数据库怎么连接到网页答辩问题...

    当您面临JSP连接MySQL数据库问题,你首先需要在MySQL数据库里创建一username表,表里面创建两个字符型的字段,字段名分别为:uid,pwd,然后插入几条测试数据. 以下用两种方式来实现J ...

  3. mysql 云端连接_云服务器远程连接mysql数据库

    首先需要在云服务器上,下载安装好mysql与Navicat. mysql下载好以后,打开云端的开始,找到mysql的命令窗,进入输入自己的mysql密码,稍等片刻进入mysql数据库 进入之后输入下列 ...

  4. linux远程桌面连接_如何从Linux连接到远程桌面

    linux远程桌面连接 根据Wikipedia的说法, 远程桌面是"一种软件或操作系统功能,它允许个人计算机的桌面环境在一个系统(通常为PC,但该概念同样适用于服务器)上远程运行,同时显示在 ...

  5. mysql解析运行时间_分析 MySQL 语句运行时间

    为了验证select 1 与 select 1 from tableName 与 select * from tableName的执行效率,需要测试一下各自执行的时间.于是总结一下,查看mysql语句 ...

  6. mysql dsn 连接_各种数据库的连接串(总结DSN的使用方法)

    第一种 - 这种方法用在ACCESS中最多 strconn = "DRIVER=Microsoft Access Driver (*.mdb);DBQ=" & Server ...

  7. mysql ssh错误_通过SSH隧道连接时,MySQL访问被拒绝错误

    几个月来,我一直通过SSH隧道连接到我们本地测试服务器上运行的 MySQL实例,没有任何问题.突然之间,没有我能想到的任何变化,服务器已经开始拒绝来自Sequel Pro的登录尝试,但错误: Unab ...

  8. mysql使用cmd命令连接_通过cmd命令连接mysql

    通过cmd的命令窗口连接mysql,只需要在命令行中输入  mysql  -uroot -p123456 .它会出现这样的提示:"mysql不是内部或外部命令".解决办法是在环境变 ...

  9. 远程mysql用ssh连接_使用SSH密钥连接到远程MySQL服务器

    远程mysql用ssh连接 In this article, it will be described how to connect to remote MySQL Server on Linux O ...

最新文章

  1. linux下的cat命令
  2. 强!chrome彻底关闭自动升级新方法实例演示,终于解决了chrome自动升级的烦恼
  3. Python基础教程:判断列表重复
  4. Codeforces Round #716 (Div. 2)
  5. Algorithm: 匈牙利算法
  6. Python编程及应用师资研修班--昆明
  7. 孩子学习缺乏主动性,应该怎么做?
  8. Redhat(Linux)上的JBoss管理配置
  9. matlab相关性分析频谱_利用Matlab绘制正弦信号的频谱图并做相关分析[共6页]
  10. LeetCode 48 旋转图像
  11. 100道Python经典练习题.pdf(附答案)
  12. 计算机机房综合布线方案,计算机网络设备施工方案(不含综合布线)(word版)
  13. 龙贝格算法的实现以及与复合梯形公式精度的比较
  14. 漂白水增稠剂看似木讷,其实在专注于分析罢了
  15. 四川交通职业技术学院计算机二级,明天考计算机了。
  16. 滴水课后作业(6-10)
  17. 老九学堂 学习C++ 第十天
  18. Vue3 Application died in status LOADING_SOURCE_CODE: You need to export the functional lifecycles in
  19. L1正则化与L2正则化详解
  20. 微信小程序菜品做法展示数据库设计_微信小程序结合后台数据管理实现商品数据的动态展示、维护...

热门文章

  1. 网络地址和广播地址的作用
  2. Linux 内核开发特点
  3. vue-cli Invalid Host header
  4. JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载
  5. 在centos7中如何搭建局域网yum源仓库
  6. 如何理解高光谱图像数据
  7. 对于数据库中表示状态或类型字段表示方法的思考
  8. Linux系统Git环境配置
  9. 一些实用的mysql语句(不断积累更新)
  10. IOS开发中UIBarButtonItem上按钮切换或隐藏实现案例