php发送数据到视图格式_PHP-FPM的相关知识的深度解释

一、需要搞清楚几个名词概念

1. CGI(Common Gateway Interface,CGI)通用网关接口, 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、Java、VB 和Delphi 等。所以说CGI是一个协议,不是进程。CGI的存在,可以使用户通过浏览器来访问执行在服务器上的动态程序;CGI是Web服务器与CGI程序间传输数据的标准;

服务器端 CGI 程序接收信息有三种途径:环境变量、命令行和标准输入。

命令行:<form>表单的Method=GET,向CGI 传递表单编码信息是通过命令方式来进行的。

标准输入:<form>表单的Method=POST,向CGI 传递表单编码信息是通过标准输入方式来进行的。

环境变量:表单编码信息是通过环境变量QUERY_STRING 来传递。

浏览器传递数据方式:

POST:发送数据大小不受限制,环境变量CONTENT_LENGTH 存放这发送数据的长度,CGI程序检查环境变量REQUEST_METHOD 确定是否采用了POST,决定是否使用标准输入

GET:发送数据小于1024字节可使用

URL+?:属于GET方式

9026ae07a9873775521bae22ce992c25.png

CGI工作机制

8ddf3b6475ecd2b97893ae35e9030b20.png

传统的CGI程序执行过程

2. FastCGI(Fast Common Gateway Interface)快速通用网关接口,是CGI的优化升级。

FastCGI发展

传统CGI接口方式主要的缺点是性能差,因为每次HTTP服务器遇到动态程序时需要重新启动脚本解析器(php-cgi)来执行解析,然后结果返回给HTTP服务器。那么在处理高并发时,几乎是不可用的。

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

FastCGI 与传统 CGI 模式的区别之一则是 Web 服务器不是直接执行 CGI 程序了,而是通过 socket 与 FastCGI 响应器(FastCGI 进程管理器)进行交互,Web 服务器需要将 CGI 接口数据封装在遵循 FastCGI 协议包中发送给 FastCGI 响应器程序。正是由于 FastCGI 进程管理器是基于 socket 通信的,所以也是分布式的,Web服务器和CGI响应器服务器分开部署。

1bb2214ee43593e106f0a5f73d27dbbe.png

基于FastCGI进程管理器程序执行过程

3. PHP-CGI是PHP解释器,它是个CGI程序,本身只能解析请求,不能管理进程。

4. PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是用来调度管理PHP-FastCGI进程的程序,在PHP5.3.3之前是php内核的一个补丁包,在后来的版本中php内核集成了php-fpm。

二、Nginx+FastCGI的工作过程

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。

为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个工作过程。

659bd20137f6daccf86c397311ef5fdf.png

三、PHP-FPM对进程的管理

Fastcgi是一个协议,不是进程。PHP-FPM实现了这个协议,是对Fastcgi程序(php-cgi)的进程管理器。

首先,先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是php-fpm的对进程的管理。php-fpm的管理对象是php-cgi。

四、PHP-FPM实现平滑重启

1. WorkerMan平滑重启

WorkerMan分为主进程和子进程,主进程负责监控子进程,子进程负责接收客户端的连接和连接上发来的请求数据,做相应的处理并返回数据给客户端。当业务代码更新时,其实我们只要更新子进程,便可以达到更新代码的目的。

当WorkerMan主进程收到平滑重启信号时,主进程会向其中一个子进程发送安全退出(让对应进程处理完毕当前请求后才退出)信号,当这个进程退出后,主进程会重新创建一个新的子进程(这个子进程载入了新的PHP代码),然后主进程再次向另外一个旧的进程发送停止命令,这样一个进程一个进程的重启,直到所有旧的进程全部被置换为止。

a2631d513d8b79a594baa445e5dbae8c.png

2. Nginx平滑重启

Nginx的进程分为master主进程和work工作进程,master进程主要管理事件信号接受和分发,所有的请求处理都由work进程处理并返回结果,Nginx的平滑重启或重载配置文件等升级,首先是向master发送重启或重载配置文件信号,然后master告诉所有的work进程不再接受新的请求,然后master另起新的work进程,最后告诉旧的work进程可以光荣退出了。

3. PHP-FPM平滑重启

php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。

五、PHP-FPM详解

PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 进程管理器,用于管理PHP 进程池的软件,用于接受web服务器的请求。

PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。

1. 为什么会出现php-fpm

fpm的出现是因为php-fastcgi出现,为了很好的管理php-fastcgi而实现的一个程序。

2. 什么是php-fastcgi

php-fastcgi 只是一个cgi程序,只会解析php请求,并且返回结果,不会管理(因此才出现的php-fpm)。

3. 为什么不叫php-cgi

其实在php-fastcgi出现之前是有一个php-cgi存在的,只是它的执行效率低下,因此被php-fastcgi取代。

4. fastcgi和cgi有什么区别

这区别就大了,当一个服务web-server(nginx)分发过来请求的时候,通过匹配后缀知道该请求是个动态的php请求,会把这个请求转给php。

在cgi的年代,思想比较保守,总是一个请求过来后,去读取php.ini里的基础配置信息,初始化执行环境,每次都要不停的去创建一个进程,读取配置,初始化环境,返回数据,退出进程,久而久之,启动进程的工作变的乏味无趣特别累。

当php来到了5的时代,大家对这种工作方式特别反感,想偷懒的人就拼命的想,我可不可以让cgi一次启动一个主进程(master),让他只读取一次配置,然后在启动多个工作进程(worker),当一个请求来的时候,通过master传递给worker这样就可以避免重复劳动了。于是就产生了fastcgi。

5. fastcgi这么好,启动的worker用完怎么办

当worker不够的时候,master会通过配置里的信息,动态启动worker,等空闲的时候可以收回worker

6. 到现在还是没明白php-fpm 是个什么东西?

就是来管理启动一个master进程和多个worker进程的程序。

PHP-FPM 会创建一个主进程,控制何时以及如何将HTTP请求转发给一个或多个子进程处理。PHP-FPM主进程还控制着什么时候创建(处理Web应用更多的流量)和销毁(子进程运行时间太久或不再需要了)PHP子进程。PHP-FPM进程池中的每个进程存在的时间都比单个HTTP请求长,可以处理10、50、100、500或更多的HTTP请求。

六、PHP-FPM安装

PHP在 5.3.3 之后已经把php-fpm并入到php的核心代码中了。所以php-fpm不需要单独的下载安装。
要想php支持php-fpm,只需要在编译php源码的时候带上 --enable-fpm 就可以了。

七、PHP-FPM配置

在Centos中,PHP-FPM 的主配置文件是 /etc/php7/php-fpm.conf。

指定一段时间内有指定个子进程失效了,PHP-FPM重启:

54cbc428e8c10c35a88e8dba92fcd0a2.png

a8a4956b13dc2feccfa057442b86760d.png

801c65919440ded7fe6e4ef4833a986a.png

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳下方

PHP进阶架构师>>>视频、面试文档免费获取​docs.qq.com
d174afaac4c7e55ceb710ae92f60d391.png

或者关注咱们下面的知乎专栏

PHP大神进阶​zhuanlan.zhihu.com
29c85f22fb1065073596c99e84ef158d.png
来源:https://www.cnblogs.com/fengguozhong/articles/11803389.html

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

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

相关文章

stm32超声波测距代码_干货!特斯拉Autopilot核心传感器解读超声波雷达篇

加入高工智能汽车行业群(自动驾驶行业4群&#xff0c;车联网智能座舱3群&#xff0c;智能商用车行业群)&#xff0c;加微信&#xff1a;15818636852&#xff0c;并出示名片&#xff0c;仅限智能网联汽车零部件及OEM厂商。目前为止&#xff0c;特斯拉的Autopilot一共经历了三代硬…

计算机网络:网络设备知识笔记

网络设备是实现计算机网络实现用户通信和交互信息的硬件基础。常用的网络设备有中继器、网桥、路由器、集线器等。 1、网络传输介质互联设备 网络线路和用户节点具体衔接时&#xff0c;需要网络传输介质的互联设备。比如T型头&#xff08;同轴电缆连接器&#xff09;、收发器、…

执行git命令时提示秘钥权限太开放‘Permissions 0644 for ‘/Users/liuml/.ssh/id_rsa_tz‘ are too open.’

执行git命令时提示秘钥权限太开放‘Permissions 0644 for /Users/liuml/.ssh/id_rsa_tz are too open.’ 报错如下 这个问题是由于 权限的问题&#xff0c;需要文件设置权限&#xff1a; chmod 600 *

eclipse折叠if语句块_Python学习日志01判断 if 语句

1.条件判断语句&#xff08;if语句&#xff09;在python中&#xff0c;if语句就是用来进行判断的&#xff0c;语法如下&#xff1a;语法&#xff1a;If 条件表达式&#xff1a;代码块执行的流程&#xff1a;if语句在执行时&#xff0c;会先对条件表达式进行求值判断&#xff1b…

mysql怎么可视化连接_IDEA连接MySQL可视化工具连接操作

IDEA连接MySQL可视化工具连接操作入下所示&#xff1a;填写完成后&#xff0c;点击测试连接&#xff0c;连接成功如图所示点击OK即可报告错误(如图所示)&#xff1a;[08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. java.ne…

Windows下图文详解PHP三种运行方式(php_mod、cgi、fastcgi)

PHP能不能成功的在Apache服务器上运行&#xff0c;就看我们如何去配置PHP的运行方式。PHP运行目前为止主要有三种方式&#xff1a; a、以模块加载的方式运行&#xff0c;初学者可能不容易理解&#xff0c;其实就是将PHP集成到Apache服务器&#xff0c;以同一个进程运行。 b、以…

计算机网络基础:ISO/OSI网络体系结构知识笔记​

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

mac下安装redis

官网地址&#xff1a;https://redis.io/ 二、下载完成后解压安装 解压命令 tar zxvf redis-6.0.6.tar.gz 切换到redis目录下 cd redis-6.0.6 编译测试 sudo make test 编译安装 sudo make install sudo make test sudo make install

mysql having和where_浅谈Mysql中where和having的区别

一、误区&#xff1a;不要错误的认为having和group by 必须配合使用.二、where和having用法解析&#xff1a;1、 where和having都可以使用的场景&#xff1a;select goods_price,goods_name from goods where goods_price > 100select goods_price,goods_name from goods ha…

ds证据理论python实现_ALI模型理论以及Python实现

https://openreview.net/forum?idB1ElR4cgg模型结构和明天要发BiGAN模型一模一样&#xff0c;但是两篇论文的作者都是独立完成自己的内容的。而且从写作的风格来看emmm完全不一样ALI跟BiGAN的设计一模一样&#xff0c;但是就是没有加Latent regressor。虽然在ALI中也简要地谈到…

IO操作总结

1&#xff0c;读取文件将文件转换为二进制流 1 InputStream in new FileInputStream("C:/test.png"); 2 byte[] photo new byte[in.available()]; 3 in.read(photo); 4 in.close(); View Code2&#xff0c;写文件 1 Outpu…

计算机网络基础:网络标准相关知识介绍

1、常见的制定网络标准的机构 国际标准化组织、国际电信联盟、电子工业协会、电气和电子工程协会、因特网活动委员会 2、常见的网络标准 2.1 电信标准 国际电信联盟&#xff08;ITU&#xff09;1947年成为联合国的一个组织&#xff0c;包括ITU-R、ITU-T、ITU-D组成。 ITU-R:无线…

1-5Tomcat 目录结构 和 web项目目录结构

对应我的安装路径&#xff1a; web项目目录结构 转载于:https://www.cnblogs.com/huiziz/p/5671612.html

execjs执行js出现window对象未定义时的解决_10个常见的JS语言错误总汇

1、 Uncaught TypeError: Cannot Read Property这是 JavaScript 开发人员最常遇到的错误。当你读取一个属性或调用一个未定义对象的方法时&#xff0c;Chrome 中就会报出这样的错误。导致这个错误发生的原因有很多&#xff0c;常见的一种情况是在渲染 UI 组件时&#xff0c;不正…

安卓logcat工具apk_backdoorapk 安卓APK后门捆绑脚本

项目地址https://github.com/dana-at-cp/backdoor-apk项目介绍backdoor-apk是一个bash写的脚本&#xff0c;通过msfvenom生成一个android的payload&#xff0c;然后再使用apktools将payload捆绑到正常的apk文件中。使用方法rootkali:~/Android/evol-lab/BaiduBrowserRat# ./bac…

java8 supplier 接口

Supplier 接口 Supplier 接口是一个供给型的接口&#xff0c;其实&#xff0c;说白了就是一个容器&#xff0c;可以用来存储数据&#xff0c;然后可以供其他方法使用的这么一个接口 *** Supplier接口测试&#xff0c;supplier相当一个容器或者变量&#xff0c;可以存储值*/Tes…

mantis apache mysql_软件测试(软件安装:php+mysql+apache+mantis过程遇到的问题以及解决方法)...

实验环境&#xff1a; Windows 7 64位操作系统浏览器版本: Mozilla Firefox 41.0.0.5378一&#xff0e;PHP的安装① 版本: php-5.4.45-Win32-VC9-x86安装步骤&#xff1a;安装将PHP安装到 D:\PHP下(目录可以自行更改)配置找到PHP目录里的类似 php.ini-dist &#xff0c;…

html登录界面_使用数据库制作一套注册登录系统

经过了那么多个星期的学习&#xff0c;终于到了使用数据库的阶段了&#xff0c;最基本的也就是制作注册登录与数据库连接。首先要制作一个注册窗口先是html界面<效果如图&#xff1a;&#xff08;样子怎么样不重要&#xff0c;重要的是测试&#xff09;这主要是将form数值发…

java8中Predicate用法

Predicate是个断言式接口其参数是<T,boolean>&#xff0c;也就是给一个参数T&#xff0c;返回boolean类型的结果。跟Function一样&#xff0c;Predicate的具体实现也是根据传入的lambda表达式来决定的。 Testpublic void predicate(){/*** Predicate谓词测试&#xff0c…

计算机网络基础:局域网协议相关知识

1、局域网协议的概念 局域网络中的通信被限制在中等规模的地理范围内&#xff0c;比如一所学校&#xff1b;能够使用具体中等或较高数据速率的物理信道&#xff0c;并且具有较低的误码率&#xff1b;局域网络是专用的&#xff0c; 由单一组织机构所使用。 局域网特点&#xff1…