本来想着发布一篇什么样子技术文章,更有意义。考虑之后想起这么一个事情,上次一个伙伴突然问我 nginx 如何解析php 文件,我瞬间懵逼了~~~或许学艺不精、但是这个是知道的,只是当时就是一下子没有想起来,思考了半天才记起来是 php-fpm 。因此、今日选择nginx如何解析php文件分享给大家。
这不、也马上就要过年了。也说明2020年跳槽季也快到了,给大家多分享一些更有意思的干货。希望能帮助到各位,喜欢的朋友可以一直看到文章底部有我联系方式。
那就开始迈入正题吧:
nginx 如何解析php文件php-fpm的解释
首先从 nginx 说起,nginx 的配置文件 ↓
代码语言:javascript复制/usr/local/nginx/conf/nginx.conf
代码语言:javascript复制location ~ .php {
root /nginx;
fastcgi_pass 127.0.0.1:9000; //ip port方式
; fastcgi_pass unix:/tmp/php-cgi.sock;【unxi domain socket形式】 这种是进程之间的访问,比tcp/ip的要快
fastcgi_index index.php;
fastcgi_split_path_info ^(. .php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi.conf;
}
从上面可以看出来 ,nginx通过fastcgi_pass命令将请求转发给fastcgi 即php-fpm;
当web server 收到 /index.php 这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。
接下来PHP解析器会解析php.ini文件,(php-fpm 如何解析php.ini 文件的? 新版PHP已经集成php-fpm了,不再是第三方的包了,推荐使用。
只需要在安装的时候
代码语言:javascript复制/configure --prefix=/usr/local/php --enable-fpm
开启支持php-fpm就可以了)初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。
web server再把结果返回给浏览器。
知识填充
CGI是为了保证web server传递过来的数据是标准格式的,标准的CGI对每个请求都会解析php.ini文件,初始化执行环境,所以处理每个时间的时间会比较长。
Fastcgi是用来提高CGI程序性能的,是CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。是优化版的cgi;fastcgi 是一个与平台无关,与语言无关,任何语言只要按照它的接口来实现,就能实现自己语言的fastcgi能力和web server 通讯。
首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。当HTTP服务器遇到动态请求时,会将请求转发给FastCGI进程,FastCGI进程执行动态脚本后再将结果返回给HTTP服务器,
--------------------以上,fastcig ,cgi都是独立于语言的;
php-cgi 就是php的解释器 php-cgi只是个CGI程序,php-cgi是php提供给web serve也就是http前端服务器的cgi协议接口程序,,他自己本身只能解析请求,返回结果,不会进程管理.所以就出现了一些能够调度php-cgi进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。好了PHP-FPM也是这么个东东,
php-fpm是一个实现了FastCGI(协议)的程序,php-fpm是php提供给web serve也就是http前端服务器的fastcgi协议接口程序,管理对象是php-cgi,PHP内核集成了PHP-FPM之后就方便多了,使用--enalbe-fpm这个编译参数即可。
整个过程 nginx接收php文件的请求后,通过fastcgi_pass命令将请求发送给php-fpm---php-cgi的进程管理器(在这中间,必须通过fastCGI进程管理器,是优化后的cgi,通过master主进程和work子进程,其实就是将请求的格式规范化),就是php-cgi的进程管理者,最后还是有php-cgi去完成解析