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
,区别可自行百度。
在介绍流程之前需要先介绍几个概念:
-
sapi
php
对外通信接口。
由于php
不能直接处理http
请求,所以它定义了一组接口与web
服务器进行通信,这组接口有几种,比较常见的是cgi/fastcgi
,apache2 handler
,cli
,打开phpinfo
可以看见配置的是哪种
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
处理php web
程序
apache
一般是将php
作为自己单独的模块去进行处理,php5.x
有php5_module
模块,php7.x
有php7_module
,apache
通过这些模块与php
通信,这种模式每次请求apache
都会产生一条进程,关键apache
还是同步阻塞的,请求需要等着处理返回结果,这样一旦达到进程的最大数,那下面的请求就需要排队,这就造成了大规模并发的问题。
-
nginx
处理php web
程序
nginx
一般和php-fpm
配合起来用,准确来说是配合实现fastcgi
的程序来使用,拿php-fpm
来说,它本身实现了动态管理进程,已经节省了资源,而nginx
又是异步非阻塞的,请求无需等待返回子进程就可以接受处理新的请求,再加上可以通过fastcgi_pass
转发请求给其他的web
服务器减少压力,从而能承受较大并发。