细说PHP-fpm
在理解php-fpm
之前,我们要先搞清楚几个关键词以及他们之间的关系:CGI
FastCGI:(Fast Common Gateway Interface),即快速通用网关接口,是一种让交互程序与Web服务器通信的协议。它是
CGI
的增强版本
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程序来处理请求)。 服务器会将辅助应用程序的数据传送给网关。然后网关会向服务器返回一条响应或者响应数据,服务器再将响应或响应数据转发给客户端。
由此我们可以清楚两点:
- 服务器和网关是相互独立的应用程序
- 服务器是应用程序和网关之间的一座桥梁
具体原理如图所示:

由此,我们可知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的,可以在http://php-fpm.org/download下载得到.
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
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++基础概念++ C ...
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...
- 细说WebSocket - Node篇
在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...
- 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包
0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- 细说 Form (表单)
细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...
- 细说ASP.NET Forms身份认证
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- CentOS 6编译安装lamp,并分别安装event模块方式和FPM方式的PHP
任务目标: 编译安装LAMP 要求(1) 安装一个模块化的PHP 要求(2) 安装一个FPM的PHP 注意PHP需要最后一个安装,因为需要前两者的支持. 所以这里的安装次序为 1.httpd 2.Ma ...
- 细说CSS选择器
众所周知,CSS的一个核心特征就是能向文档中的一组元素类型应用某些规则.每个规则都有两个基本部分:选择器(selector)和声明块(declaration block).下图显示了规则的各个部分. ...
- Nginx与Lua利用fpm打成rpm包
1.下载相关软件 需要软件有:Nginx,LuaJIT,ngx_devel_kit,ngx_lua等安装文件 安装Lua或者LuaJIT都是可以的,但是出于效率的考虑,推荐安装LuaJITshell& ...
随机推荐
- c#语法复习总结(1)-浅谈c#.net
出来工作两年,发现自己进步太小了,工作能力是不能混的,想先从基础知识好好复习一下,再深入的学习一些高级框架和先进的理念.找回了博客园的密码账号,好好学习和总结.先从数据类型总结一下,无非就是值类型,引 ...
- APS.NET MVC + EF (02)---深入理解ADO.NET Entity Framework
2.7 深入理解Entity Framework 性能问题几乎是一切ORM框架的通病,对于EF来说,引起性能低的原因主要在以下几个方面. 复杂的对象管理机制为了在.NET中更好地管理模型对象,EF提供 ...
- RSA公钥加密私钥解密
公司的项目需要电科院测评,必须保证数据的完整性和保密性,为这两个特性不得不搞个RSA+SHA1加密. 页面处理过程: 每次登录前,先向后端发送请求,由RSA生成一对公钥和私钥,获取公钥中的模modul ...
- CMS-headless or non-headless, page-based or object-based storage?
内容管理系统对于很多在线教育企业来说都是至关重要的,他不仅可以用于内容的创作,编辑,发布,撤销,展示也可以用于运营或者市场产生他们需要的页面. 传统上,Wordpress是一个非常成功的CMS,他将内 ...
- Spring Security OAuth2.0 - AuthorizationServer和ResourceServer分离
<Spring Security实现OAuth2.0授权服务 - 基础版>和<Spring Security实现OAuth2.0授权服务 - 进阶版>两篇文章中介绍如何搭建OA ...
- [转发] SAP EPIC 银企直连+TRM资金管理
事务代码:EPIC_PROC 电子支付集成 收款; 付款; 付款审批; 银行回单(下载,创建,修改,辩识,认领); 查询账户余额; 查询交易明细; BADI增强; VA虚拟账户客户回单自动辨识; .. ...
- English--并列句
English|并列句 现在开始讲解英语中的最简单的长句,即并列句. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩. 情感:用我自己的方式, ...
- CSS 初识
一.CSS 发展历程 从HTML被发明开始,样式就以各种形式存在.不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制.最初的HTML只包含很少的显示属性. 随着HTML的成长,为了满足页面设计 ...
- Java学习之:Spring的扩展配置
1.在配置文件applicationContext.xml中,引入相关的配置文件方式: 2.使用Jndi数据源的方式改造配置文件applicationContext.xml: 3.注释配置文件appl ...
- linux清理系统缓存
Linux 内存优化. 1.清理前内存使用情况 free -m 2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成 ...