以cgi的模式运行php,php的几种运行模式CLI、CGI、FastCGI、mod_php

一、CLI:就是命令行,例如能够在控制台或者是shell中键入命令:php

php -f index.php

而后获取输出web

二、CGI:如下是不一样的说法与理解shell

公共网关接口”(Common Gateway Interface),HTTP服务器 与你的或其它机器上的程序 进行 “交谈”的一种工具 ,其程序 须运行在网络 服务器 上。在服务器 环境中,为“程序 ”提供标准 的接口,经过这个接口,“程序 ”能够对服务器 与客户端 交换的信息 作一些事情 。“程序 ”的语 言并无要求。程序 对接口进行 操做。服务器 要支持 CGI就要提供CGI中要求的环境变量 ,或者还有别的。apache

HTTP Server和一个独立的进程之间的协议,把HTTP Request的Header设置成进程的环境变量,HTTP Request的正文设置成进程的标准输入,而进程的标准输出就是HTTP Response包括Header和正文。bash

这个 Web 服务器使用了 UNIX shell 环境变量 来保存从 Web 服务器传递出去的参数,而后生成一个运行 CGI 的独立进程。服务器

不一样类型语言写的程序只要符合cgi标准,就能做为一个cgi程序与web服务器交互cookie

以CGI方式运行时,web server将用户请求以消息的方式转交给PHP独立进程,PHP与web服务之间无从属关系。网络

我的理解:CGI规定了php与web server交流的规则,至关于执行了response = exec("php -f index.php -url=xxx -cookie=xxx -xxx=xxx")。socket

文中阐述了CGI与CLI的显著区别:

如下为 CLI SAPI 和其它 CLI SAPI 模块相比的显著区别:

与 CGI SAPI 不一样,其输出没有任何头信息。

尽管 CGI SAPI 提供了取消 HTTP 头信息的方法,但在 CLI SAPI 中并不存在相似的方法以开启 HTTP 头信息的输出。

CLI 默认以安静模式开始,但为了保证兼容性,-q 和 --no-header 参数为了向后兼容仍然保留,使得可使用旧的 CGI 脚本。

在运行时,不会把工做目录改成脚本的当前目录(可使用 -C 和 --no-chdir 参数来兼容 CGI 模式)。

出错时输出纯文本的错误信息(非 HTML 格式)。

三、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在此便退出了。

php-fpm:PHP的FastCGI进程管理器

四、mod_php:即apache的php模块,将PHP作为web-server的子进程控制,二者之间有从属关系.最明显的例子就是在CGI模式下,若是修改了PHP.INI的配置文件,不用重启web服务即可生效,而模块模式下则须要重启web服务。以mod_php模式运行PHP,意味着php是做为apache的一个模块来启动的,所以只有在apache启动的时候会读取php.ini配置文件并加载扩展模块,在apache运行期间是不会再去读取和加载扩展模块的

Apache的工做模式 prefork的工做原理

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

worker的工做原理

每一个进程可以拥有的线程数量是固定的。服务器会根据负载状况增长或减小进程数量。一个单独的控制进程(父进程)负责子进程的创建。每一个子进程可以创建ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。Apache老是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的创建便可获得处理。在Unix中,为了可以绑定80端口,父进程通常都是以root身份启动,随后,Apache以较低权限的用户创建子进程和线程。User和Group指令用于配置Apache子进程的权限。虽然子进程必须对其提供的内容拥有读权限,但应该尽量给予他较少的特权。另外,除非使用了suexec ,不然,这些指令配置的权限将被CGI脚本所继承

我的理解:这种模式把php嵌入到apache中,至关于给apache加入了解析php文件的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值