基于java和php的http协议处理方式对比
基于java和PHP对一个http请求进行处理的方式可以用下面这个简单的图示体现出来:
1.处理PHP程序的php-fpm服务接收到的是基于CGI(通用网关接口)的数据协议封装过的http数据,所以只要你精通CGI协议,理论上可以自己实现一个类似php-fpm的服务接收CGI数据,然后用自创的一门脚本语言去处理http数据。
2.tomcat是一个web服务容器,它可以像nginx一样监听一个IP和端口,接收http协议的数据。只不过它自身就拥有处理http协议数据的能力,而nginx只能转发给其他模块处理,nginx要不就通过ngx_http_proxy_module将http协议的数据进行转换,交给php-fpm这类的CGI代理服务器用PHP之类的脚本语言处理,要不就利用反向代理的方式直接将数据原样转发给tomcat去处理。由于tomcat可以直接处理http协议数据,所以它可以直接面向客户端,不过一般不会这样做。
3.php-fpm是基于c实现的服务,采用多进程的方式运行,每个http请求由单个进程处理。tomcat是基于java实现的,服务运行在jvm虚拟机内,服务运行采用多线程的方式,每个http请求由单个线程处理,tomcat对http请求的处理是将http的请求和返回数据进行封装后交给一个实现了servlet接口的类去处理,这里体现了java的面向接口编程的特点。
4.php-fpm在处理http请求时,最终会将PHP脚本交给zend引擎处理,这里在每个http请求处理的过程中都要执行一些PHP代码中的初始化逻辑,这是php性能优化的关键和难点所在。而tomcat服务在启动过程中会执行大量java代码的初始化逻辑(参考spring框架的依赖注入——DI),虽然服务启动时间较长,但是在处理请求的过程中省去了大量初始化的时间,处理时间就短了。