php cli和fastcgi,php的几种运行模式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整个流程:

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进程管理器

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脚本所继承

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自学前端,你要的学习资料到了~~~~~~

你要的学习资料到了~~~~~~ 你还在找一个纯技术交流的地方嘛?你还在找一个每天更新资料的群吗?现在加裙617986737,无论是小白还是大神,可以尽情的讨论。 加裙条件: 1:保证自己常在线,一直沉默潜水的人不许加…

html文档php 取mac地址_cpu序列号_硬盘序列号,用vbs脚本获取网卡MAC,CPUID,硬盘序列号的实现代码...

这里先给大家分享一个分配静态ip地址的代码 Assign a Static IP AddressstrComputer "."Set objWMIService GetObject("winmgmts:" _& "{impersonationLevelimpersonate}!\\" & strComputer & "\root\cimv2")Set colNet…

T7-Dropout 解决 overfitting 过拟合

Dropout 解决 overfitting 相对于过拟合(overfitting,或称:过度学习)是指,使用过多参数,以致太适应训练数据而非一般情况;另一种常见的现象是使用太少参数,以致于不适应当前的训练数…

PHP伪造来源HTTP,伪造来源采集http.php

伪造来源采集.php"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11","safari 5.1 – Windows">"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gec…

从零开始构建一个的asp.net Core 项目(一)

最近突发奇想,想从零开始构建一个Core的MVC项目,于是开始了构建过程。 首先我们添加一个空的CORE下的MVC项目,创建完成之后我们运行一下(Ctrl F5)。我们会在页面上看到“Hello World!”。 既然是从零开始构建的项目&am…

oracle sal01,oracle中 all any in的用法

Oracle的嵌套子查询可以使用Some,Any和All对子查询中返回的多行结果进行处理。Some表示满足其中一个的含义,是用or串起来的比较从句。例如:SELECT * FROM emp WHERE empno hmz OR dept 10Any也表示满足其中一个的含义,也是用or串起来的比较…

BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id4884 【题目大意】 太空猫(SpaceCat)是一款画面精致、玩法有趣的休闲游戏,   你需要控制一只坐在迷你飞碟上的猫咪在太空里不断探索,让大家看看你能飞得多远。   游戏地图可以看成一个…

oracle 怎么创建类型,ORACLE—002:Create之创建类型

——积累工作中用到的SQLORACLE中也是有类型的,可作为存储过程,函数等的输入输入出。下面看下创建。用法CREATE OR REPLACE TYPE 类型名称 AS OBJECT(字段1 类型,字段2 类型,字段3 类型)例如CREATE OR REPLACE TYPE T_OBJ A…

201521123014 《Java程序设计》第11周学习总结

201521123014 《Java程序设计》第11周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。 2. 书面作业 Q1 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步…

前端先锋博客大全

须要想这些人学习: http://www.nowamagic.net/librarys/veda/cate/JavaScript/ 唯有积累,没有奇迹 http://www.zhangxinxu.com/wordpress/ 张鑫旭 http://www.14px.com/ 14px http://hax.iteye.com/category/20374 hax http://w3help.org/zh-cn/ http:…

oracle死锁视频教程,两个Oracle死锁解决实例

关于数据库中的死锁。如果在应用中碰到都会毫不犹豫转交给DBA,但是从目前我接到的deadlock的问题来看,和Oracle官方的描述基本都关于数据库中的死锁。如果在应用中碰到都会毫不犹豫转交给DBA,但是从目前我接到的deadlock的问题来看&#xff0…

FineReport实现java报表统计图表的效果图

Java报表-ERP图表联动 Java报表-多维坐标轴图 Java报表-静态图表 Java报表-时间坐标轴 Java报表-图表报表动态交互 Java报表-图表热点链接 Java报表-图表缩放 Java报表-地图-广州市商场销售分析 Java报表-地图-全国商场销售分析 Java报表-地图-商场柜台销售分析 Java报表-图表分…

Mysql 性能优化20个原则(2)

5. 在Join表的时候使用相当类型的例,并将其索引 如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。 而且,这些被用来Join的字段,应该…

安装apk文件到linux,使用adb命令,将apk安装到安卓system/app下

adb环境变量配置:1.下载android sdk2.win10配置adb环境变量,控制面板-系统-高级系统设置-高级-环境变量-系统变量-在Path中增加adb.exe的路径E:\sdk\platform-tools3.重新打开cmd,输入adb,可识别即可安装xxx.apk到system下&#x…

使用Dom4j读取指定文件,并写入指定文件

导入dom4j的包,然后写入代码如下package com.dom4j.cn;import java.io.FileOutputStream;import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.ju…

linux ks脚本,Linux ks.cfg 详解

linux安装大致可以分为2个阶段第一阶段:anaconda第二阶段:installinstall阶段系统会按照anaconda阶段设定的参数自动安装,这里主要要说的是anaconda阶段,此阶段是linux的预安装环境,提供linux安装选项的一个接口&#…

干锅土豆

食材:土豆、配料:蒜蓉,干辣椒、蒜苗,海鲜酱油、辣椒粉、孜然粉、花椒粉 做饭:1:土豆切条,洗好,用盐腌制30分钟,倒出水分 2:锅里放多油,煸炒土豆&a…

linux内核空间open,Linux内核源码分析 - open

在linux下,假设我们想打开文件/dev/tty,我们可以使用系统调用open,比如:int fd open("/dev/tty", O_RDWR, 0); 本文将从源码角度看下,在linux内核中,open方法是如何打开文件的。首先看下入口函数…

数据库管理和应用

http://www.dbmng.com/item-11.html转载于:https://www.cnblogs.com/tianciliangen/p/6828062.html

linux命令帮助怎么看,Linux命令帮助

Linux命令帮助教程在Linux man命令详解概述man 命令,它是 Manual pages 的缩写,它是 Linux 系统中在线软件文档的一种普遍的形式,其内容包括计算机程序(包括库和系统调用)、正式的标准和惯例,抽象的概念等。man 工具是显示系统手册…