php web运行流程
1.php
简单介绍
php
,超文本预处理语言,超文本可以联想到html
,可以解释php
也是一门web
端语言,当然php
当今主要用法也是用在web
上。 预处理顾名思义,提前处理的意思,我的理解是我们执行html
文件时只要通过浏览器打开,浏览器会实时渲染代码。当执行php
文件时,我们需要先通过web
服务器转发给php
解释器处理返回html
代码,php
解释器会执行嵌入在php
文件中的php
代码,这样返回给浏览器渲染的代码其实已经提前处理过了。
2.php web
请求运行流程
说起php web
不得不提起web
服务器,与php
结合比较紧密的服务器主要有两种,nginx
与apache
,区别可自行百度。
在介绍流程之前需要先介绍几个概念:
-
cgi/fastcgisapi
php
对外通信接口。
由于php
不能直接处理http
请求,所以它定义了一组接口与web
服务器进行通信,这组接口有几种,比较常见的是cgi/fastcgi
,apache2 handler
,cli
,打开phpinfo
可以看见配置的是哪种
apache2 handler -
cgi
cgi
叫网关通信协议,他是一种协议,介于web
服务器与cgi
程序之间,它规定了web
服务器该把数据以怎样的数据结构传给cgi
程序,然后cgi
程序处理完代码之后该以怎样的数据结构把数据回传给web
服务器。 -
php-cgi
php
的cgi
程序,可以通过php
的实现了cgi
协议的cgi/fastcgi
接口接受数据处理,不过cgi
有个很坑的地方,每次web
请求都会启动一次cgi
程序然后再退出,这样对大规模并发并不友好。 -
fastcgi
为了优化以上问题,所以引出了fastcgi
,fastcgi
可以看成cgi
协议的升级版,它事先早早启动多个cgi
程序,等待web
请求,处理完了之后也不会退出,等待下一个请求。 -
php-fpm
实现了fastcgi
的php
进程管理器,php-fpm
启动时有三种模式,即静态,动态,按需。我们一般用的是动态,在php-fpm
启动时预先启动一个主进程和20个子进程(可配置),请求空闲或请求繁忙是会自动kill
或fork
一个子进程,但不能高于配置好的最大子进程数与最小子进程数。主进程负责分发(其实子进程会竞争)web
请求给子进程,同时解析配置文件,初始化执行环境,对子进程进行管理,而子进程只负责处理,至于什么时候退出处理状态,什么时候kill
,均交给主进程。php-fpm
通常与nginx
一起配合使用。 -
apache处理apache
处理php web
程序
apache
一般是将php
作为自己单独的模块去进行处理,php5.x
有php5_module
模块,php7.x
有php7_module
,apache
通过这些模块与php
通信,这种模式每次请求apache
都会产生一条进程,关键apache
还是同步阻塞的,请求需要等着处理返回结果,这样一旦达到进程的最大数,那下面的请求就需要排队,这就造成了大规模并发的问题。
-
nginx处理nginx
处理php web
程序
nginx
一般和php-fpm
配合起来用,准确来说是配合实现fastcgi
的程序来使用,拿php-fpm
来说,它本身实现了动态管理进程,已经节省了资源,而nginx
又是异步非阻塞的,请求无需等待返回子进程就可以接受处理新的请求,再加上可以通过fastcgi_pass
转发请求给其他的web
服务器减少压力,从而能承受较大并发。