最近在研究PHP的源码,有时候会延伸到很多东西。这里就专程找了下php-fpm的内容学习下。

是什么?

在理解php-fpm之前,我们要先搞清楚几个关键词以及他们之间的关系:CGI

FastCGI

php-fpm

php-cgi.

CGI:(Common Gateway Interface),即通用网关接口的意思,描述的是服务器和请求处理程序之间传输数据的一种标准。 所以,CGI是一种协议。CGI可用于任何语言,只要该语言具有标准的输出、输入以及环境变量。如perl、php等语言。 以nginx和php为例,我们可以理解为,这是php在与nginx服务器之间交互时,对传输数据的一种约定。

在《HTTP权威指南》书中,是这么描述的

CGI是一个标准接口集,Web 服务器可以用它来装载程序以响应对特定 URL 的 HTTP 请求,并收集程序的输出数据,将其放在 HTTP 响应中回送。

那CGI的原理是什么呢

当需要请求使用网关的资源时,服务器会请辅助应用程序来处理请求(比如nginx会请php程序来处理请求)。 服务器会将辅助应用程序的数据传送给网关。然后网关会向服务器返回一条响应或者响应数据,服务器再将响应或响应数据转发给客户端。

由此我们可以清楚两点:

服务器和网关是相互独立的应用程序

服务器是应用程序和网关之间的一座桥梁

具体原理如图所示:

image.png

由此,我们可知CGI有一个致命的弱点,即应用程序的每次请求,都要引发一个全新的进程。所以,服务器和网关之间的分离会造成性能的 耗费,会限制使用CGI的服务器的性能,并且会加重服务端机器资源的负担。

好啦,重角要登场了。后来为了解决这个问题,出现了FastCGI,也就是快速的CGI。 接下来,我们再详细的了解下FastCGI。

FastCGI:(Fast Common Gateway Interface),即快速通用网关接口,是一种让交互程序与Web服务器通信的协议。它是CGI的增强版本

FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求。

以上来自维基百科,我们可以由此了解到,FastCGI,同CGI一样,也是一种协议,只不过它是CGI的增强版本。

那FastCGI是如何增强性能的呢?

FastCGI接口模拟了CGI,但FastCGI是作为持久守护进程运行的,消除了为每个请求建立或拆除新进程所带来的性能损耗。也就是允许,一个进程内可以处理多个请求。 也就说CGI解释器保持在内存中,并接受了FastCGI进程管理和调度,所以它可以提供更好的性能,可扩展性,故障切换等特点

FastCGI的特点

FastCGI与语言无关

FastCGI应用在进程中,独立于核心网络服务器,提供了一个比API环境更安全的环境。 APIs的代码和web服务器的应用的核心是 紧紧关联的。这也就意味着在API应用程序的错误可能会损坏其它应用程序或核心服务器。恶意API应用程序代码甚至可以窃取另一个应用程序或核心服务器密钥。

FastCGI技术摸钱支持PHP,C/C++, Java language, Perl, Tcl, Python, SmallTalk, Ruby etc.. 它在Apache, ISS, Lighttpd和其他流行的 服务器中的相关模块都是可以使用的。FastCGI不依赖于任何服务器体系结构,所以即使服务器在技术上改变了,FastCGI还是稳定的

FastCGI的工作原理

Web Server 启动时载入FastCGI进程管理器 (IIS ISAPI 或Apache Module)

FastCGI进程管理器首先初始化自己,启动一批CGI解释器进程(可见多个php-cgi),然后等待来自Web Server的连接。

当Web Server中的一个客户端请求达到时, FastCGI进程管理器会选择并连接一个CGI解释器。Web server的CGI环境变量和标准输入会被送达FastCGI进程的php-cgi。

FastCGI子进程从同一连接完成返还给Web Server的标准输出和错误信息。当请求进程完成后,FastCGI进程会关闭此连接。FastCGI会等待并出来来自FastCGI进程管理器(运行在Web Server中的)的下一个连接。 在CGI模式,php-cgi然后会退出。

FastCGI的不足

因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。 Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M10=150M),开启的64个php-cgi进程消耗1280M内存(20M64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。 如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

PHP-CGI: PHP-CGI是PHP自带的FastCGI管理器。

PHP-CGI的不足

php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启

直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)

php-fpm

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在

PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。 PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

讲php fpm的书,细说PHP-fpm相关推荐

  1. Centos7利用fpm制作rpm包(fpm安装及使用)

    安装fpm 安装ruby yum -y install ruby rubygems ruby-devel 查看当前ruby源 gem source -l 添加国内源,删除国外源 gem sources ...

  2. php fpm 安装配置,php php+fpm安装配置

    sudo apt - get install php5 - cgi php5 - mysql php5 - fpm php5 - curl php5 - gd php5 - idn php - pea ...

  3. php fpm的日志,开启php fpm错误日志的方法

    开启php fpm错误日志的方法 发布时间:2020-11-05 09:42:55 来源:亿速云 阅读:101 作者:小新 这篇文章将为大家详细讲解有关开启php fpm错误日志的方法,小编觉得挺实用 ...

  4. 有没有讲python模块的书_python - 模块,包

    一.模块 定义:有些功能开发者自己无法完成(例:与操作系统打交道,时间,1000取随机数,压缩文件,网络通信),需要借用已经实现的函数/类来完成这些功能 模块的分类: 1,   内置函数:安装pyth ...

  5. 跟熊浩学沟通30讲读后感_20191026听书笔记《跟熊浩学沟通》

    每天听本书<跟熊浩学沟通>. 你需要思考四个维度,它们分别是结构.性质.目标和风格.可以帮助我们形成一个"一以贯之"的策略预判和行为指针."策略预判" ...

  6. php 脚本 fpm缓存,PHP生命周期及fpm(FastCGI进程管理器)的运作方式

    PHP在web方式中如何改了文件就立即生效的,重要的几个概念:sapi: 可以简单的理解为php引擎对外的一个统一接口,使得php可以和外部程序进行交互 php的生命周期中关键四个调用: MINT - ...

  7. 使用fpm简单制作自定义rpm包

    我的环境是centos7.2的 一.安装FPM工具 yum -y install ruby rubygems ruby-devel gem sources list   查看gem包管理源仓库地址 g ...

  8. php fpm 不写errorlog,PHP-FPM不写入错误日志

    PHP-FPM不写入错误日志 我刚刚安装了一个nginx + php-fpm服务器. 一切似乎很好,除了PHP-FPM从不将错误写入其日志. fpm.conf [default] listen = / ...

  9. Linux下开源打包工具fpm的安装与使用(超详细)

    Linux下开源打包工具fpm的安装与使用 一.fpm概述 二.fpm的安装 1.安装ruby环境 2.安装fpm 三.fpm的使用 1.fpm常用参数 2.举例要求 3.准备目录 4.编写脚本文件 ...

最新文章

  1. 【LeetCode】136. Single Number 解题小结
  2. 怎样用计算机算分数乘分数,《分数乘分数》教案.pdf
  3. Spring mvc 中处理模型数据 ModelAndView
  4. 机器学习模型 非线性模型_机器学习模型说明
  5. 第五课 机器学习中的特征工程
  6. readonly和const比较
  7. 如果一栋楼起火谁赔偿_太原一辆快递车起火!赶紧看看有你的包裹没?
  8. layui 开启关闭标签_layui新手入门所踩的一些坑
  9. 深入理解Tomcat系列之一:系统架构(转)
  10. Cocos2d-x 3.2:定时器的使用和原理探究(1)
  11. AWVS14.5最新版的安装与使用
  12. 报表工具ActiveReports开发实例——物联网智能供水云平台
  13. 利用Python做假设检验、参数估计、方差分析、线性回归
  14. MPC-HC 播放器设置
  15. r语言爬虫和python爬虫哪个好-R语言爬虫常用方法总结(以案例说明)
  16. 虚拟隧道协议(L2TP)识别及实现
  17. font-family、font-style、font-weight、font-variant的区别「In CSS」
  18. 【瞎逛】音乐碎碎笔记 01
  19. 用递归的方式分析白色相簿2 coda篇各结局概率
  20. 飞猪、去哪儿网被列入大数据“杀熟”名单,超50%的人遭遇过被“杀熟”

热门文章

  1. 旅游行业春节档期的大数据营销
  2. @MySQL的存储引擎
  3. Android 隐式意图的配置
  4. “高考”机器人横空出世 2017年居然要考“大学”
  5. [summary] 单调队列
  6. Haproxy 与 Cookie
  7. Silverlight 3 全系列开发工具发布
  8. 简单论述市场营销管理的基本过程
  9. 于敦德:途牛五大战略纵深不惧同质化竞争
  10. jdbctemplate mysql 配置_Spring JDBCTemplate配置使用