php的运行模式
1、Web模块模式(Apache等Web服务器运行的模式)
2、CGI(通用网关接口/ Common Gateway Interface)
3、FastCGI(常驻型CGI / Long-Live CGI)
4、CLI(命令行运行 / Command Line Interface)
1、模块模式
web服务器将php作为module方式加载到服务器中,以Apache为例,需要在配置中开启php模块的加载。
LoadModule php7_module libexec/apache2/libphp7.so
开启配置后,php将成为apache的一个子模块。当Apache接收到请求后,会调用php7_module来解析php代码。php模块与Apache之间则通过sapi接口来进行通信。
module模式的缺点:php作为apache的一部分,php出现问题,会导致Apache也不可用
一个http请求的执行过程如下:
apache -> httpd -> php7_module -> sapi -> php
2、CGI
CGI(Common Gateway Interface)全称是“通用网关接口”,是 Web Server 与 Web Application 之间数据交换的一种协议。其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。php的CGI程序名称为:php-cgi
CGI协议规定了web服务器与php之前的数据通信标准,例如需要传输的url、参数、header头等。
优点:CGI的好处就是完全独立于任何服务器,仅仅是做为中间分子。提供接口给apache和php。他们通过cgi搭线来完成数据传递。这样做的好处了尽量减少2个的关联,使他们2变得更独立。
缺点:每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式,不能承受高并发
3、FastCGI
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少web服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。
FastCGI程序运行原理:
- FastCGI 进程管理器启动时会创建一个 主(Master) 进程和多个 CGI 解释器进程(Worker 进程),然后等待 Web 服务器的连接。
- Web 服务器接收 HTTP 请求后,将 CGI 报文通过 套接字(UNIX 或 TCP Socket)进行通信,将环境变量和请求数据写入标准输入,转发到 CGI 解释器进程。
- CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回给 Web 服务器。
- CGI 解释器进程等待下一个 HTTP 请求的到来。
FastCGI与CGI特点:
- 对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重新初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
- 由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。