一、总结

一句话总结:
PHP能不能成功的在Apache服务器上运行,就看我们如何去配置PHP的运行方式。
PHP运行模式,目前为止主要有四种方式:
1、mod_php、以模块加载的方式运行,初学者可能不容易理解,其实就是将PHP集成到Apache服务器,以同一个进程运行。
2、CGI、以CGI的方式运行,CGI英文叫做公共网关接口,就是Apache在遇到PHP脚本的时候会将PHP程序提交给CGI应用程序(php-cgi.exe)解释,解释之后的结果返回给Apache,然后再返回给相应的请求用户。
3、FastCGI、以FastCGI的方式运行。
这种形式是CGI的加强版本,CGI是单进程,多线程的运行方式,程序执行完成之后就会销毁,所以每次都需要加载配置和环境变量fork-and-execute(创建-执行)。
而FastCGI则不同,FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次。
FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
4、CLI,命令行运行。

1、php的CLI运行模式是什么?

CLI就是命令行,例如可以在控制台或者是shell中键入命令。

2、php中的CGI运行模式是什么?

以CGI的方式运行,CGI英文叫做公共网关接口,就是Apache在遇到PHP脚本的时候会将PHP程序提交给CGI应用程序(php-cgi.exe)解释,解释之后的结果返回给Apache,然后再返回给相应的请求用户。
CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。
CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。
格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。
几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、VB 和Delphi 等。
CGI 分为标准CGI 和间接CGI两种。
标准CGI 使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。
间接CGI 又称缓冲CGI,在CGI 程序和CGI 接口之间插入一个缓冲程序,缓冲程序与CGI 接口间用标准输入输出进行通信。
公共网关接口”(Common Gateway Interface),HTTP服务器 与你的或其它机器上的程序 进行 “交谈”的一种工具 ,其程序 须运行在网络 服务器 上。
在服务器 环境中,为“程序 ”提供标准 的接口,通过这个接口,“程序 ”可以对服务器 与客户端 交换的信息 做一些事情 。
“程序 ”的语 言并没有要求。程序 对接口进行 操作。服务器 要支持 CGI就要提供CGI中要求的环境变量 ,或者还有别的。
个人理解:
CGI规定了php与web server交流的规则,相当于执行了response = exec(“php -f index.php -url=xxx -cookie=xxx -xxx=xxx”)。

3、php的运行模式FastCGI是什么?

以FastCGI的方式运行。
这种形式是CGI的加强版本,CGI是单进程,FastCGI多线程的运行方式,程序执行完成之后就会销毁,所以每次都需要加载配置和环境变量fork-and-execute(创建-执行)。
而FastCGI则不同,FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次。
FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。

4、php的运行模式mod_php是什么?

以模块加载的方式运行,初学者可能不容易理解,其实就是将PHP集成到Apache服务器,以同一个进程运行。

5、php中常见的几种运行模式?

PHP能不能成功的在Apache服务器上运行,就看我们如何去配置PHP的运行方式。PHP运行目前为止主要有三种方式:

  1. a、以模块加载的方式运行,初学者可能不容易理解,其实就是将PHP集成到Apache服务器,以同一个进程运行。
  2. b、以CGI的方式运行,CGI英文叫做公共网关接口,就是Apache在遇到PHP脚本的时候会将PHP程序提交给CGI应用程序(php-cgi.exe)解释,解释之后的结果返回给Apache,然后再返回给相应的请求用户。
  3. c、以FastCGI的方式运行。这种形式是CGI的加强版本,CGI是单进程,多线程的运行方式,程序执行完成之后就会销毁,所以每次都需要加载配置和环境变量fork-and-execute(创建-执行)。而FastCGI则不同,FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次。FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。

6、php的CGI运行模式如何配置 ?

cgi的方式运行,需要修改php配置文件:

  1. cgi.force_redirect = 0 //本来是 1 并且去掉注释符号;

修改apache的配置,去掉原来的模块配置:

  1. AddType application/x-httpd-php .php
  2. LoadModule php5_module "C:/php5/php5apache2_2.dll"
  3. PHPinidir "C:/php5/php.ini"

7、CGI是什么?

最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html。
事物总是不 断发展,网站也越来越复杂,所以出现动态技术。
但是服务器并不能直接运行 php,asp这样的文件,自己不能做,外包给别人吧,但是要与第三方做个约定,我给你什么,然后你给我什么,就是我把请求参数发送给你,然后我接收你的处 理结果给客户端。
那这个约定就是 common gateway interface,简称cgi。
这个协议可以用vb,c,php,python 来实现。cgi只是接口协议,根本不是什么语言。
下面图可以看到流程:

8、CGI和FastCGI是什么?

CGI工作原理:
每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),CGI 的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。当然,这样在访问量很少没有并发的情况也行。可是当访问量增大,并发存在,这种方式就不 适合了。
于是就有了fastcgi。
CGI有很多缺点,每接收一个请求就要fork一个进程处理,只能接收一个请求作出一个响应。
请求结束后该进程就会结束。
而FastCGI会事先启动起来,作为一个cgi的管理服务器存在,预先启动一系列的子进程来等待处理,然后等待web服务器发过来的请求,一旦接受到请求就交由子进程处理,这样由于不需要在接受到请求后启动cgi,会快很多。
FastCGI使用进程/线程池来处理一连串的请求。
这些进程/线程由FastCGI服务器管理,而不是Web服务器。
当进来一个请求时,Web服务器把环境变量和这个页面请求通过一个Socket长连接传递给FastCGI进程。
FastCGI像是一个常驻型的CGI,它可以一直执行,在请求到达时不会花费时间去fork一个进程来处理(这是CGI对位人诟病的fork-and-execute模式)。
正是因为它只是一个通信协议,它还支持分布式的运算,即FastCGI程序可以在网站服务器以外的主机上执行并且接受来自其他网站服务器的请求
FastCGI整个流程:
Web server启动时载入FastCGI进程管理器
FastCGI自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web server的请求
当请求Web server时,Web server通过socket请求FastCGI进程管理器,FastCGI进程管理器选择并连接到一个CGI解释器,Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi
FastCGI子进程处理请求完成后将标准输出和错误从同一连接返回给Web server,当FastCGI子进程结束后请求便结束。
FastCGI子进程接着等待处理来自FastCGI进程管理器的下一个连接,在CGI模式中,php-cgi在此便退出了。

9、mod_php模式:Apache的工作模式 prefork的工作原理

一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。
Apache总是试图保持一些备用的 (spare)或是空闲的子进程用于迎接即将到来的请求。
这样客户端就无需在得到服务前等候子进程的产生。
在Unix系统中,父进程通常以root身份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。
User和Group指令用于配置子进程的低特权用户。
运行子进程的用户必须要对他所服务的内容有读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。

10、worker的工作原理

每个进程能够拥有的线程数量是固定的。
服务器会根据负载情况增加或减少进程数量。
一个单独的控制进程(父进程)负责子进程的建立。
每个子进程能够建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
Apache总是试图维持一个备用(spare)或是空闲的服务线程池。
这样,客户端无须等待新线程或新进程的建立即可得到处理。
在Unix中,为了能够绑定80端口,父进程一般都是以root身份启动,随后,Apache以较低权限的用户建立子进程和线程。
User和Group指令用于配置Apache子进程的权限。虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予他较少的特权。
另外,除非使用了suexec ,否则,这些指令配置的权限将被CGI脚本所继承。
个人理解:
这种模式把php嵌入到apache中,相当于给apache加入了解析php文件的功能。

总结:

  1. CLI:执行命令行调用Zend引擎解析PHP代码
  2. Mod_PHP:模块化扩展引入到Apache中运行
  3. CGI:单进程处理WEB请求,定义了WEB请求的规范
  4. FastCGICGI的加强版,多进程处理WEB请求