mod_php、FastCGI、PHP-FPM等PHP运行方式对比


Posted in PHP onJuly 02, 2015

概述

写这篇文章的是因为今天要Ubuntu下搭建LNMP环境,Nginx使用的是PHP-FPM,所以对Web服务器与PHP解释器的交互方式做了个整理。

众所周知,PHP是跨平台、跨服务器的语言,这也是它如此流行的原因之一。但是,很少有人知道PHP解释器可以以不同的方式运行在Web服务器中。PHP最常用的方式是以模块的方式(mod_php)运行在Apache中,也是Apache运行PHP的默认方式。但是在Nginx中,Nginx又使用的是PHP-FPM。

这篇文章就对这些概念做个介绍,如有不对的地方,请多多批评指教。

什么是PHP处理器(PHP handlers)?

首先需要记住的是,任何一种Web服务器(Apache、Nginx等)都是被设计成向用户发送html、图片等静态资源的,Web服务器自身并不能解释任何动态脚本(PHP、Python等)。PHP处理器就是用来解释Web应用中的PHP代码,并将它解释为HTML或其他静态资源,然后将解析的结果传给Web服务器,最后再由Web服务器发送给用户。大多数的Web服务器都不能解析PHP代码,因此它需要一个能解析PHP代码的程序,这就是PHP处理器。

mod_php

首先,来看一下以Apache模块方式运行PHP。mod_php现在在Linux各版本的软件仓库里都有,因此很容易被安装。

当PHP以模块的方式运行在Apache中时,PHP解释器被“内嵌”在Apache的进程里。Apache不会调用任何外部的PHP进程,因此这种方式使Apache与PHP能更好的通信。但是,当以这种方式运行PHP的时候,哪怕Apache提供的仅仅是静态的资源(如HTML),Apache的每个子进程也都会载入 mod_php,导致了比正常情况下更多的内存开销。

以这种方式运行的另一个缺点是,它仅能与Apache一起配合工作。另外,在小型的VPS和大型的网站中,这种方式也不合适,因为大型网站可能有很多静态资源,而这些静态资源是不需要PHP程序解释的。

优点:
1.易于安装和更新
2.容配置
缺点:
1.仅能与Apache一起工作
2.增加了Apache子进程内存开销
3.当更改php.ini文件后,需要重启Apache

FastCGI

FastCGI是交互程序与Web服务器通用的协议接口,是早期CGI(Common Gateway Interface)的一个变种。相对于CGI来说,FastCGI减少了和Web服务器交互的开销,同时一次可以处理更多的请求。

Apache可以以mod_fcgid的形式使用FastCGI。其他Web服务器,如lighttpd, nginx, Cherokee,甚至微软的IIS也都能使用FastCGI。使用FastCGI,可以同时设置多个版本的PHP,这在某些情况下非常有用。

FastCGI还利用suexec来支持不同的用户用自己的PHP的实例。这个特性对于在共享环境下提高安全性尤其重要。FastCGI在保证性能的同时,也减少了Web服务器的内存开销。

优点:
1.兼容多数Web服务器
2.比mod_php占内存小
3.更多的配置项,包括多版本PHP和suexec
缺点
1.配置复杂
2.不被大家所熟知

PHP-FPM(FastCGI Process Manager)

PHP-FPM是Web服务器使用PHP的一种最新方式,也是PHP FastCGI的另外一种实现。PHP-FPM对于运行在小型VPS和多服务器上的Web应用非常应用。同时,它也可以被兼容FastCGI的任何Web服务器所使用。

PHP-FPM使管理员能够优雅地停止和启动PHP工作进程而不丢失任何查询。这允许我们逐步更新配置和二进制,而不会损失任何查询。它还允许我们在发生任何意外破坏的情况下,紧急重启进程。

优点:
1.兼容多数Web服务器
2.比mod_php占内存小
3.更多的配置项,包括多版本PHP和suexec
缺点
1.配置复杂
2.不被大家所熟知

补充:Apache运行PHP的四种方式

mod_php (DSO,Dynamic Shared Object)
CGI
suPHP
FastCGI

总结

内容相对抽象,理解的不深,记录下留作以后参考~:)

PHP 相关文章推荐
windows xp下安装pear
Dec 02 PHP
Ajax PHP分页演示
Jan 02 PHP
PHP6 mysql连接方式说明
Feb 09 PHP
PHP 编程安全性小结
Jan 08 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
curl实现站外采集的方法和技巧
Jan 31 PHP
php使用递归函数实现数字累加的方法
Mar 16 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
php文件上传类完整实例
May 14 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
PHP中的流(streams)浅析
Jul 02 #PHP
PHP curl使用实例
Jul 02 #PHP
PHP中使用curl入门教程
Jul 02 #PHP
Smarty最简单实现列表奇偶变色的方法
Jul 01 #PHP
PHP中的常见魔术方法功能作用及用法实例
Jul 01 #PHP
PHP获取文件夹大小函数用法实例
Jul 01 #PHP
Thinkphp模板标签if和eq的区别和比较实例分析
Jul 01 #PHP
You might like
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
分析经典Python开发工程师面试题
2019/04/08 Python
浅析python标准库中的glob
2020/03/13 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
酒店中秋节活动方案
2014/01/31 职场文书
先进员工获奖感言
2014/08/14 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
学校重阳节活动总结
2015/03/24 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
庆七一晚会主持词
2015/06/30 职场文书
小学四年级作文之写景
2019/08/23 职场文书
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android