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 Coding Tips(php小技巧)[2011/04/02最后更新]
May 02 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
深入PHP autoload机制的详解
Jun 09 PHP
PHP 之 写时复制介绍(Copy On Write)
May 13 PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
php常用图片处理类
Mar 16 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
PHP检测链接是否存在的代码实例分享
May 06 PHP
php5与php7的区别点总结
Oct 11 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
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
js href的用法
2010/05/13 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
2016/05/31 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
九月份红领巾广播稿
2014/01/22 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
演讲稿的写法
2014/05/19 职场文书
环保项目建议书
2014/08/26 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
2015年保送生自荐信
2015/03/24 职场文书
员工年度工作总结2015
2015/05/18 职场文书
色戒观后感
2015/06/12 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript