php和java请求处理过程的对比

PHP处理请求的过程简述

用户通过url地址,到Nginx服务器,nginx通过反向代理和负载均衡等一系列处理后找到一台后端服务器,然后通过fastcgi协议将请求转移给php-fpm。

php-fpm其实是一个实现了fastcgi协议的进程管理器,由一个master进程和多个worker进程组成。
master进程只负责管理worker进程,真正负责请求的是worker进程。worker进程接收到请求后会去执行我们的php代码,因为php是解释型语言,所以每次执行其实都是边解释边执行,但其实跟请求次数相比,代码修改的次数是很少的,后面就引入了opcache,将编译成的opcode缓存起来,这样可以减少编译的次数,执行完后将请求结果再依次返回回去,一个请求就完成了。
image.png

再具体一点,php-fpm启动后,会创建一个socket,监听端口,假设是9000端口,n然后fork多个worker进程出来,worker进程会阻塞在accept这里,当有请求到达的时候,所有的worker去竞争,竞争到的worker会开始接收并解析请求数据,然后执行php脚本,拿到结果后返回数据并关闭请求,然后继续等待下一个请求的到来。
当子进程处理到一定数量的请求会就会被master给kill掉,然后重启一个子进程。
在这里插入图片描述

Java请求的处理过程

我们的moa服务都是基于Netty的,Netty最有名的就是Reactor反应器模式。

建立一个socket通信的几个阶段就如下面图所示,在server端,就有很多个隐藏的阻塞点。就比如accept以后,server也不是瞬间就能从这个socket上读到client的请求的,更不是一瞬间处理完请求将结果写回。

image.png

php-fpm的做法是,如果一个worker进程accept了请求,那它就不会再accept其他的请求了,并且会顺序执行完这次请求:
accept请求 -》从socket读取数据 -》 处理业务逻辑(执行php代码) -》 将请求结果写回 -》关闭连接。

在reactor中并不是这样的,reactor中有两个线程池,首先,它就不是顺序执行的。Reactor将socket连接的acctept和IO分开了。一个线程池,只负责accept请求,还有一个worker线程池里去,当数据可读时,就丢给线程池,线程池根据pipeline处理请求,最后reactor再把响应写回。
redis也是这样的,只不过redis是单线程的reactor模型,主线程accpet,主线程同时也执行各种事件处理器。
单线程的reactor
image.png

多线程的reactor
image.png

moa的部分代码(全部的也看不太懂- -!)
bossGroup 表示服务器连接线程组,专门accept新的client的链接
workerGroup 表示处理每一条连接的数据收发的线程组
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值