PHPphp的几种植运行模式CLI、CGI、FastCGI、mod_php

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

php -f index.php

然后拿走输出

 

2、CGI:以下是例外之说法同了解

    公共网关接口”(Common Gateway Interface),HTTP服务器 与您的要其它机器及之主次 进行 “交谈”的相同种植工具 ,其程序 须运行于网络 服务器 上。在劳务器 环境被,为“程序 ”提供标准 的接口,通过是接口,“程序 ”可以对劳务器 与客户端 交换的音 做有事情 。“程序 ”的语 言并没要求。程序 对接口进行 操作。服务器 要支持 CGI就如供CGI中求的环境变量 ,或者还有别的。

    HTTP Server及一个独自的进程中的磋商,把HTTP
Request的Header设置成进程的环境变量,HTTP
Request的正文设置成进程的规范输入,而经过的标准输出就是HTTP
Response包括Header和正文。

    这个 Web 服务器使用了 UNIX shell 环境变量 来保存于 Web
服务器传递出去的参数,然后转一个运作 CGI 的单独进程

    不同类型语言描绘的次一旦入cgi标准,就会看做一个cgi程序及web服务器交互

    以CGI方式运行时,web
server将用户要以信息的点子转送给PHP独立进程,PHP与web服务中无从属关系。

 

    个体理解:CGI规定了php与web server交流的平整,相当给实践了response
= exec(“php -f index.php -url=xxx -cookie=xxx -xxx=xxx”)。

 

    关于CGI与CLI区别可以查看官方文档说之老大对的:http://php.net/manual/zh/features.commandline.php

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

        以下为 CLI SAPI 和另 CLI SAPI 模块相比的肯定区别:

  • 与 CGI SAPI 不同,其出口没有其它头信息。

    尽管 CGI SAPI 提供了注销 HTTP 头信息之点子,但以 CLI
    SAPI
     中连无设有类似之法门以被 HTTP 头信息的输出。

    CLI 默认以坦然模式开始,但为保兼容性,-q 和 –no-header 参数为为后相当仍然保留,使得可以行使原有的
    CGI 脚本。

    当运转时,不会见拿工作目录改吗脚本的当前目录(可以使 -C 和 –no-chdir 参数来配合 CGI
    模式)。

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

 

3、FastCGI:CGI有为数不少通病,每接收一个呼吁虽设fork一个经过处理,只能吸收一个求作出一个应。请求了后该过程就见面终结。而FastCGI会事先启动起来,作为一个cgi的田间管理服务器在,预先启动同系列之子进程来等待处理,然后等待web服务器发过来的乞求,一旦受到要虽到由子进程处理,这样由未待以承受到要后开行cgi,会快很多。FastCGI使用过程/线程池来处理系列的要。这些过程/线程由FastCGI服务器管理,而非是Web服务器。
当进来一个请求时,Web服务器将环境变量和这页面请求通过一个Socket长连传递让FastCGI进程。FastCGI像是一个常驻型的CGI,它好直接实行,在呼吁到达时无会见花时间错开fork一个经过来拍卖(这是CGI对位人诟病的fork-and-execute模式)。正是因为它仅是一个通信协议,它还支持分布式的演算,即FastCGI程序可以当网站服务器以外的主机及实施并且接受来自其他网站服务器的求

    FastCGI整个流程:

  1. Web server启动时载入FastCGI进程管理器

  2. FastCGI自身初始化,启动多个CGI解释器进程(可见多单php-cgi)并伺机来自Web
    server的乞求

  3. 当求Web server时,Web
    server通过socket请求FastCGI进程管理器,FastCGI进程管理器选择并连接至一个CGI解释器,Web
    server将CGI环境变量和专业输入发送到FastCGI子进程php-cgi

  4. FastCGI子进程处理要完成后用标准输出以及不当从同连接返回给Web
    server,当FastCGI子进程结束后要虽结束。FastCGI子进程就等待处理来自FastCGI进程管理器的下一个总是,在CGI模式中,php-cgi在斯便退出了。

 

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

 

4、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文件之功效。

 

相关文章