php - fpm 请求达到max_children最大值后,新进入的请求工作流程
前言
偶然之间想了解下,php-fpm 请求达到max_children最大值后,新进入的请求怎么办?是抛出502还是等待前面的请求完成后,再将请求交给处理完毕的进程处理呢。
准备工作
运行环境:LNMP
php 版本:php8.1+
首先要先了解nginx 和 php-fpm 的交互模式采用的是惊群现象。网上很多说是nginx-work将请求交给了php-fpm主进程,再由php-fpm主进程将请求下发给下面的子进程。 这其实是错误的,不信的话,你可以将主进程删掉,然后请求试试,看能不能正常处理。
如下图所示,我把master主进程干掉后,nginx-work 转发依然可以得到php正确的处理,所以可得结论:nginx-work并不是把请求交给了master主进程处理请求。而是采用惊群现象,多个php-fpm子进程抢占式处理请求,当一个进程拿到此请求的锁后,其它进程则不能再处理此请求。
回归正题
如下图所示,我干掉了绝大部分php进程(master进程,php-fpm 子进程),只留下了一个php-fpm 进程。
然后我建立了两个请求
request - 1 : 等待10s
public function test(){ sleep(10);}
reques-2 :立即通过id登录
public function idLogin(int $id){ $userEntity = $this->userService->getUserIdEntity($id); if(empty($userEntity)) { throw new UserException(__('user.userNotFound')); } $token = $this->userService->userLogin($userEntity); return [ 'token' => $token, 'user' => $userEntity ]; }
执行顺序
先执行1 , 让唯一的一个php工作进程被占用。
再执行2,此时的情况是。请求一直在被堵塞,待请求1的10s解除后,请求2理解正确返回了结果。
总结
右上测试可知:php - fpm 请求达到max_children最大值后,新进入的请求会被阻塞(可以理解为被放置在了某个队列中),待前面的请求处理完毕后,一个一个交付给空闲进程处理。
来源地址:https://blog.csdn.net/u014559227/article/details/132583370
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341