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 相关文章推荐
怎样在PHP中通过ADO调用Asscess数据库和COM程序
Oct 09 PHP
PHP Session变量不能传送到下一页的解决方法
Nov 27 PHP
PHP 柱状图实现代码
Dec 04 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
国外十大最流行的PHP框架排名
Jul 04 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
May 29 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
Oct 08 PHP
PHP实现大数(浮点数)取余的方法
Feb 18 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中serialize()和unserialize()函数
2017/07/08 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
php时间戳转换代码详解
2019/08/04 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
Ant Design的Table组件去除
2020/10/24 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
利用python GDAL库读写geotiff格式的遥感影像方法
2018/11/29 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
小学教师学期末自我评价
2013/09/25 职场文书
大学四年规划书范文
2013/12/27 职场文书
运动会广播稿30字
2014/01/21 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
北京申奥口号
2014/06/19 职场文书
社会实践的活动方案
2014/08/22 职场文书
庆七一宣传标语
2014/10/08 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
营业用房租赁协议书
2014/11/26 职场文书
2016年感恩节寄语
2015/12/07 职场文书