天涯论坛

 找回密码
 立即注册
搜索
查看: 13|回复: 3

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

[复制链接]

3139

主题

3万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968622
发表于 2024-10-4 19:35:55 | 显示全部楼层 |阅读模式

1、CLI:command-line interface命令行接口

能够掌控是shell中键入命令。如:

php index.php

2、CGI :(Common Gateway Interface)公共网关接口

CGI实质上是一种程序之间的交互协议,一般做为HTTP Server和“程序”进行“交流”的一种工具。这儿的“程序”即实现了CGI协议的程序,咱们能够叫作之为CGI程序,CGI程序的实现语言并需求。例如PHP-CGI便是实现了CGI协议的CGI程序,而HTTP Server本身要实现CGI协议才可和PHP-CGI交互。

经过CGI协议,保准了HTTP Server传递过来的数据是标准格式的,以方便CGI程序的编写者。服务器要支持CGI就要供给CGI中需求的环境变量,还有别的。该协议需求HTTP Server把HTTP Request的Header设置成CGI程序的环境变量,HTTP Request的正文设置成CGI程序的标准输入,而CGI程序的标准输出便是HTTP Response,包含Header和正文。

再进一步详细举例来讲的话,php以CGI方式运行时,web server(例如说nginx)按照配置文件晓得这个不是静态文件,需要去找PHP解析器来处理,那样他会把这个请求简单处理后交给PHP-CGI。Nginx会传那些数据给PHP-CGI呢?url要有吧,查询字符串得有吧,POST数据要有,HTTP header不可少吧,好的,CGI协议便是规定要传那些数据、以什么样的格式传递给后方处理这个请求的协议。将用户请求以信息的方式转交给PHP-CGI独立进程。

实质上上面这个流程说明了一个问题便是PHP与web服务之间并不是从属关系。

那样,CLI和CGI有那些明显区别呢?

(1)CLI与 CGI SAPI 区别,CLI其输出任何头信息。

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

(2)CLI 默认以安静模式起始,但为了保准兼容性,-q 和 --no-header 参数为了向后兼容仍然保存,使得能够运用旧的 CGI 脚本。

(3)CLI在运行时,不会把工作目录改为脚本的当前目录(能够运用-C和--no-chdir 参数来兼容CGI模式)。

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

3、FastCGI:(Fast Common Gateway Interface)快速公共网关接口

顾名思义,FastCGI是CGI的升级版本,运行速度更快。传统的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进程管理器选取并连接到一个PHP-CGI,Web server将CGI环境变量和标准输入发送到FastCGI子进程PHP-CGI

(4)FastCGI子进程处理请求完成后将标准输出和错误从同一连接返回给Web server,当FastCGI子进程结束后请求便结束。FastCGI子进程接着等待处理来自FastCGI进程管理器的下一个连接。(在CGI模式中,php-cgi这里便退出了)。

4、PHP-FPM:(PHP Fast CGI Process Manager)PHP-fastcgi进程管理器

PHP-FPM是一个实现了Fastcgi协议的程序,被PHP官方收了。能够说php-fpm是实现了fastcgi协议的php-cgi进程的管理器,用来管理fastcgi进程的。

经过上面咱们晓得,php-cgi只是一个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理。因此显现有些能够调度php-cgi进程的程序,例如说由lighthttpd分离出来的spawn-fcgi。因此PHP-FPM是这么个东东,在长期的发展后,逐步得到了大众的认可(要晓得,前几年大众可是抱怨PHP-FPM稳定性太差的),越来越流行。

5、mod_php:即apache的php模块

Mod_php模式将PHP做为web-server的子进程掌控,两者之间有从属关系.最显著的例子便是在CGI模式下,倘若修改了PHP.INI的配置文件,不消重启web服务便可生效,而模块模式下则需要重启web服务。以mod_php模式运行PHP,寓意着php是做为apache的一个模块来起步的,因此呢仅有在apache起步的时候会读取php.ini配置文件并加载扩展模块,在apache运行时期是不会再去读取和加载扩展模块的

(1)Apache的工作模式prefork的工作原理、

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

(2)worker的工作原理

每一个进程能够持有的线程数量是固定的。服务器会按照负载状况增多或减少进程数量。一个单独的掌控进程(父进程)负责子进程的创立每一个子进程能够创立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这般,客户端无须等待新线程或新进程的创立就可得到处理。在Unix中,为了能够绑定80端口,父进程通常都是以root身份起步,随后,Apache以较低权限的用户创立子进程和线程。User和Group指令用于配置Apache子进程的权限。虽然子进程必须对其供给的内容持有读权限,但应该尽可能给予他较少的特权。另一,除非运用了suexec ,否则,这些指令配置的权限将被CGI脚本所继承

个人理解:这种模式把php嵌入到apache中,相当于给apache加入认识析php文件的功能。

6、基于fast-cgi协议模式的nginx和php-fpm交互细节

Nginx与PHP-fpm之间经过socket进行通讯,重点有两种通信方式unix socket和tcp socket

(1)nginx配置比较

unix socket需要在nginx配置文件中填写php-fpm运行的pid文件(即sock文件)位置

location ~ \.php$ {

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;

fastcgi_pass unix:/var/run/php5-fpm.sock;

fastcgi_index index.php;

}

tcp socket需要在nginx配置文件中填写php-fpm运行的ip位置和端口号。

location ~ \.php$ {

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

}

(2)特点比较

从上面的照片能够看,unix socket减少了不必要的tcp开销,而tcp需要经过loopback,还要申请临时端口和tcp关联资源。然则,unix socket高并发时候不稳定,连接数爆发时,会产生海量的长时缓存,在面向连接协议的支撑下,大数据包可能会直接出错不返回反常。tcp这般的面向连接的协议,多少能够保准通信的正确性和完整性。

选取意见倘若是在同一台服务器上运行的nginx和php-fpm,并发量不超过1000,选取unix socket,由于是本地,能够避免有些检测操作(路由等),因此呢更快,更轻。 倘若面临高并发业务,我会选取运用靠谱的tcp socket,以负载平衡、内核优化等运维手段维持效率。

(3)nginx和php协同处理请求的通用流程:

1. nginx.conf配置webserver参数, 请求PHP类应用可配置fastcgi_pass,指明监听端口或socket位置

2. php-fpm.conf中listen位置与nginx.conf fastcgi_pass字段配置一致(sock文件或是端口),显示php-fpm worker进程监听目的

3. 起步后,请求先到达nginx server端口,分发到对应位置,若配置了fastcgi-pass,则被转到对应端口或socket,php-fpm master进程监听到,再创建fork worker进程实质运行,运行结束返回给nginx。即如下所示:

www.example.com =》

Nginx =》

路由到www.example.com/index.php =》

加载nginx的fast-cgi模块 =》

fast-cgi监听127.0.0.1:9000位置=》

www.example.com/index.php请求到达127.0.0.1:9000 =》

php-fpm 监听127.0.0.1:9000 =》

php-fpm 接收到请求,启用worker进程处理请求 =》

php-fpm 处理完请求,返回给nginx =》

nginx将结果经过http返回给浏览器

因此综上所述,Nginx和phpcgi都是实现了cgi协议的cgi程序,cgi协议规定了交互(输入和输出)的数据格式和方式,这个方式便是socket。





上一篇:大学生学PHP研发好就业吗?PHP就业前景怎么样?
下一篇:PHP 平常设计模式——工厂模式
回复

使用道具 举报

3091

主题

3万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098764
发表于 2024-10-8 22:12:48 | 显示全部楼层
楼主继续加油啊!外链论坛加油!
回复

使用道具 举报

3048

主题

3万

回帖

9606万

积分

论坛元老

Rank: 8Rank: 8

积分
96065850
发表于 2024-10-15 17:59:54 | 显示全部楼层
我们有着相似的经历,你的感受我深有体会。
回复

使用道具 举报

3063

主题

3万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139046
发表于 10 小时前 | 显示全部楼层
你的见解真是独到,让我受益匪浅。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 16:29 , Processed in 0.147952 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.