设为首页 收藏本站
开启辅助访问 快捷导航
菜单
猿人部落 主页 资讯 查看内容

PHP底层和mysql的通信原理

2019-7-23 03:40 发布者: superadmin 评论 0 查看 1120
必要清楚的多少 个概念:FPM进程:进程数正在 php-fpm.ini中配置 。不 配置 max_requests ,那么进程是不 会烧毁的,也就是说当一个进程内里呈现 去世 循环年夜 概内存溢出等导致 进程僵去世 的情况呈现 的工夫 ,处置处罚的进程

必要清楚的多少 个概念:

FPM进程:进程数正在 php-fpm.ini中配置 。不 配置 max_requests ,那么进程是不 会烧毁的,也就是说当一个进程内里呈现 去世 循环年夜 概内存溢出等导致 进程僵去世 的情况呈现 的工夫 ,处置处罚的进程就会少一个。

mysql毗邻 数:一个进程毗邻 到mysql的一个库,算是一个毗邻 。毗邻 数默认 100,我们 线上是5000,进程数正在 my.cnf中配置 。mysql毗邻 数要年夜 于便是FPM进程数,不然 会报错。

长毗邻 以及 短毗邻 :FPM短毗邻 MYSQL的工夫 ,无需调用CLOSE函数,由于正在 RSHUTDOWN的工夫 ,会调用收拾整顿 。长毗邻 的工夫 ,必要调用close,长毗邻 会不停霸占 资源,直到进程去世 丢失 。


起首我们 来明白一下 php-fpm 的任务 原理 ,php-fpm 是一个 php-cgi 进程管理 器,着实就是一个毗邻 池,它以及 nginx共同的任务 原理 如下。

我们 先从最简朴的静态方式 入手 不雅观 察他的任务 原理

vim php-fpm.ini

[www]

pm = static

pm.max_children = 5

pm.max_requests = 2

上面 三句话的寄义是什么呢:

1、static 表现静态以静态方式 天生 php-fpm 进程

2、pm.max_children = 5 表现当 php-fpm 启动时就启动 5 个 php-fpm 子进程 等候处置处罚 nginx 发过去 的恳求

3、pm.max_requests = 2 表现每 个 php-fpm 子进程处置处罚 2 个恳求 就烧毁,当然 父进程每 次看到有烧毁的自然也就会天生新的子进程

我们 来简朴验证一下这个说法:

起首重启 php-fpm,让它复位一下

接上去 写一条简朴的语句输入 以后 进程ID

echo "以后 php-fpm 进程ID:".posix_getpid();

不 断革新赞赏 器不雅观 察输入 厘革

以后 php-fpm 进程ID:24548

以后 php-fpm 进程ID:24549

以后 php-fpm 进程ID:24550

以后 php-fpm 进程ID:24547

以后 php-fpm 进程ID:24551

以后 php-fpm 进程ID:24548

以后 php-fpm 进程ID:24549

以后 php-fpm 进程ID:24550

以后 php-fpm 进程ID:24547

以后 php-fpm 进程ID:24551

以后 php-fpm 进程ID:24563

以后 php-fpm 进程ID:24564

以后 php-fpm 进程ID:24565

以后 php-fpm 进程ID:24566

以后 php-fpm 进程ID:24567

以后 php-fpm 进程ID:24563

以后 php-fpm 进程ID:24564

以后 php-fpm 进程ID:24565

以后 php-fpm 进程ID:24566

以后 php-fpm 进程ID:24567

以后 php-fpm 进程ID:24568

以后 php-fpm 进程ID:24569

以后 php-fpm 进程ID:24570

以后 php-fpm 进程ID:24571

以后 php-fpm 进程ID:24572

以后 php-fpm 进程ID:24568

以后 php-fpm 进程ID:24569

以后 php-fpm 进程ID:24570

以后 php-fpm 进程ID:24571

以后 php-fpm 进程ID:24572

可以看患上 出,第一批id不 是按照 次第 实行的,进程id为24547的进程是正在 第四位处置处罚的,而后 从上面 末尾 ,全副 id都是次第 实行的而且 每 次天生的一批id都是递增,是不 是有种mysql自增主键的赶脚呢?

这里必要注意的是,不管 是静态还是上面 的静态 配置 方式 ,只要 不 配置 max_requests ,那么进程是不 会烧毁的,也就是说当一个进程内里呈现 去世 循环年夜 概内存溢出等导致 进程僵去世 的情况呈现 的工夫 ,处置处罚的进程就会少一个了

好吧明白了静态的处置处罚方式 ,我们 着实也很轻易晓患上 这团体 式格式 的毛病了,当然 我们 平常效劳 器不 年夜 概就开5个进程每 个进程处置处罚2个恳求 ,我们 来做一个简朴的加减乘除了 ,看看一个效劳 器应当 开多少 个 php-fpm 契合

起首我们 来看看一个简朴的echo必要多少 内存:

$size = memory_get_usage();

$unit = array('b','kb','mb','gb','tb','pb');

$memory = @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];

echo "以后 php-cgi 进程所使用内存:".$memory;

不雅观 察赞赏 器我们 可以患上 到 一下数据:

以后 php-cgi 进程所使用内存:227.17 kb

也就是说一个简朴的什么都不 干的php就已经 经占用了200多K的内存,当然 这也不 算多。

不 过进程多了cpu切换进程速率就会变慢,以是这个数还是必要颠末 ab等测试工具 才气测试出具体应当 开多少 比力公道

我们 先从200个cgi进程末尾 ,不 断的增长,架设增长到800的工夫 ,服从以及 400异样 ,那我们 就不必 开800那么多进程糜费 内存了。

那么标题就来了,假如同临时 间恳求 出高出400呢?有人说会列队等候,真的会列队等候吗?答案光鲜明显 是 php-fpm 是没本领列队了,由于处置处罚恳求 的php-fpm子进程都用完了,那么等候也就只能是正在 nginx 等候,凡是 一个 nginx 也不 只是转发恳求 给 php-fpm 就完事了,他还要处置处罚静态文件呢?假如这些php恳求 导致 nginx的恳求 数过多不停正在 等候,那么拜访 静态文件自然也会卡了,这时 候我们 就必要配置 成上面 的静态 处置处罚方式 。

[www]

pm.max_children = 10

pm.start_servers = 5

pm.min_spare_servers = 2

pm.max_spare_servers = 8

;pm.max_requests = 2

上面 五句话的寄义是什么呢:

1、dynamic 表现静态以静态 方式 天生 php-fpm 进程

2、pm.max_children = 10 同时活动的进程数 10个

3、pm.start_servers = 5 表现当 php-fpm 主进程启动时就启动 5 个 php-fpm 子进程

4、pm.min_spare_servers = 2 表现最小备用进程数

5、pm.max_spare_servers = 8 表现最年夜 备用进程数

6、pm.max_requests = 2 上面 说过就不 说了

以后 php-fpm 进程ID:2270

以后 php-fpm 进程ID:2271

以后 php-fpm 进程ID:2272

以后 php-fpm 进程ID:2273

以后 php-fpm 进程ID:2274

以后 php-fpm 进程ID:2270

以后 php-fpm 进程ID:2271

以后 php-fpm 进程ID:2272

以后 php-fpm 进程ID:2273

以后 php-fpm 进程ID:2274

以后 php-fpm 进程ID:2270

以后 php-fpm 进程ID:2271

以后 php-fpm 进程ID:2272

以后 php-fpm 进程ID:2273

以后 php-fpm 进程ID:2274

为何 这里不 重更生 成新的进程?由于pm.max_requests = 2被解释丢失 了,这个上面 着实已经 经提及过一次了

我们 也可以 从 ps 看出这批进程id

ps aux|grep php

root 2269 0.0 0.1 134560 4616 ? Ss 14:27 0:00 php-fpm: master process (/etc/php/php-fpm.ini)

www-data 2270 0.2 0.2 136736 9188 ? S 14:27 0:00 php-fpm: pool www

www-data 2271 0.2 0.2 136740 9192 ? S 14:27 0:00 php-fpm: pool www

www-data 2272 0.2 0.2 134684 7284 ? S 14:27 0:00 php-fpm: pool www

www-data 2273 0.2 0.2 136732 9120 ? S 14:27 0:00 php-fpm: pool www

www-data 2274 0.1 0.2 134684 7244 ? S 14:27 0:00 php-fpm: pool www

从上面 我们 可以看到一个 id 为 2269 的 php-fpm 主进程 管理 着 id 为 2270、2271、2272、2273、2274 的5个php-fpm 子进程

这里必要注意的是,当并发年夜 过start_servers数的处置处罚本领是,备用进程才会启动,当并发数小的工夫 ,备用进程也会烧毁丢失 ,以是不管 什么时候 ,ps 出来的进程都是上面 那5个

上面 来看看php-fpm+mysql的结果

mysql> show processlist;

+----+------------------+-----------+------+---------+------+----------------+-------------------------+

| Id | User | Host | db | Command | Time | State | Info |

+----+------------------+-----------+------+---------+------+----------------+-------------------------+

| 9 | root | localhost | NULL | Query | 0 | NULL | show processlist |

+----+------------------+-----------+------+---------+------+----------------+-------------------------+

接上去 我们 看短毗邻 :

$conn = new mysqli("192.168.0.170", "redol", "redol", "test_db");

而后 不 断拜访 上面 的php文件,每 次看到的都是

+----+---------+-----------+------+---------+------+----------------+--------------------+

| Id | User | Host | db | Command | Time | State | Info |

+----+---------+-----------+------+---------+------+----------------+--------------------+

| 9 | root | localhost | NULL | Query | 0 | NULL | show processlist |

+----+---------+-----------+------+---------+------+----------------+--------------------+

这也是php神秘 之处 ,竟然 不 用close的,每 次恳求 完了他就本身给你close丢失 以及 mysql的毗邻 了,这点的确 也让许多新手 少了不 少上面 的烦恼 啊

Warning: mysqli::mysqli(): (HY000/1040): Too many connections in ...

不 要以为语言 应当 都是如许那就打错特错了,去看看golang吧

上面 看看长毗邻

$conn = new mysqli("p:192.168.0.170", "redol", "redol", "test_db");

你没看错,mysqli的长毗邻 以及 mysql不 同,是正在 host后面 加 p:,不 mysqli_pconnet 的用法,估计 许多刚末尾 用mysqli也是摸不 着脑子 吧?

第一次拜访 :

+----+-------+-------------------------+-------+---------+------+-------+------------------+

| Id | User | Host | db | Command | Time | State | Info |

+----+-------+-------------------------+-------+---------+------+-------+------------------+

| 9 | root | localhost | NULL | Query | 0 | NULL | show processlist |

| 10 | redol | bbs.demo.kkk5.com:16650 | redol | Sleep | 34 | | NULL |

+----+-------+-------------------------+-------+---------+------+-------+------------------+

革新一下网页

+-----+-------+-------------------------+-------+---------+------+-------+------------------+

| Id | User | Host | db | Command | Time | State | Info |

+-----+-------+-------------------------+-------+---------+------+-------+------------------+

| 9 | root | localhost | NULL | Query | 0 | NULL | show processlist |

| 10 | redol | bbs.demo.kkk5.com:16650 | redol | Sleep | 4 | | NULL |

| 727 | redol | bbs.demo.kkk5.com:16657 | redol | Sleep | 1 | | NULL |

+-----+-------+-------------------------+-------+---------+------+-------+------------------+

再革新一下网页,结果我就不 发了,反正你晓患上 着末 不管 怎么样 革新,都是如下便可

+-----+-------+-------------------------+-------+---------+------+-------+------------------+

| Id | User | Host | db | Command | Time | State | Info |

+-----+-------+-------------------------+-------+---------+------+-------+------------------+

| 9 | root | localhost | NULL | Query | 0 | NULL | show processlist |

| 10 | redol | bbs.demo.kkk5.com:16650 | redol | Sleep | 4 | | NULL |

| 727 | redol | bbs.demo.kkk5.com:16657 | redol | Sleep | 1 | | NULL |

| 728 | redol | bbs.demo.kkk5.com:16659 | redol | Sleep | 16 | | NULL |

| 729 | redol | bbs.demo.kkk5.com:16661 | redol | Sleep | 12 | | NULL |

| 730 | redol | bbs.demo.kkk5.com:16663 | redol | Sleep | 8 | | NULL |

+-----+-------+-------------------------+-------+---------+------+-------+------------------+

也就是说,长毗邻 是真的会不停霸占 mysql毗邻 的,那么标题就来了,假如我不 重启 php-fpm,只重启了mysql,会呈现 什么标题呢?答案是第一次毗邻 的工夫 会报上面 错误

Warning: mysqli::mysqli(): MySQL server has gone away in    ###也就是毗邻 已经 经存正在

以是用长毗邻 query前还是先判定有不 毗邻 ,不 就close毗邻 ,注意一定 要close,再毗邻 ,不然 毗邻 是收效 的。

上面 我们 来尝尝 Too many connections 的错误吧

先调解一下mysql的最年夜 毗邻 数

vim /etc/mysql/my.cnf

max_connections = 3

你没看错,我只给了他3个毗邻 ,而上面 的php-fpm是5个,以是结果不 用我说都晓患上 了吧,准期的呈现

Warning: mysqli::mysqli(): (HY000/1040): Too many connections in ...

以是线上的mysql,还是注意一下这个max_connections数吧,我只能通知 你他默认 是100,假如你以为100不 敷用的话,本身改去吧

从上面 可知,短毗邻 是不 用close也会自动封闭 的,那假如是配置 了 pm.max_requests = 2,每 个php-fpm处置处罚两个恳求 就烧毁,烧毁了会close么?我就不 截图了,直接通知 答案吧,会的,以是不管 怎么样 ,看到的mysql都是1、2、3、4、5、4、3、2、1、2、3、4、5如许的毗邻 数,就是逐步增长,再逐步镌汰,镌汰是由于php-fpm子进程烧毁了嘛


来源:https://www.jianshu.com/p/d955a5413c7e
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

路过

雷人

握手

鲜花

鸡蛋
收藏 邀请
上一篇:比较CGI,FastCGI,PHP下一篇:PHP安装配置

相关阅读

一周热门

头条攻略!

日排行榜

相关分类