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加密解密的代码
Oct 09 PHP
php preg_filter执行一个正则表达式搜索和替换
Feb 27 PHP
使用PHP求两个文件的相对路径
Jun 20 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
Mar 03 PHP
深入理解PHP中的count函数
May 31 PHP
浅谈PHP中的数据传输CURL
Sep 06 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
Laravel配合jwt使用的方法实例
Oct 25 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编程注意事项的小结
2013/04/27 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
js 通过cookie实现刷新不变化树形菜单
2014/10/30 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
应征英语教师求职信
2013/11/27 职场文书
医学专业五年以上个人求职信
2013/12/03 职场文书
材料加工工程求职信
2014/02/19 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
招商银行工作证明
2015/06/17 职场文书
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers