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 删除数组元素
Jan 16 PHP
有关JSON以及JSON在PHP中的应用
Apr 09 PHP
php ajax 静态分页过程形式
Sep 02 PHP
邮箱正则表达式实现代码(针对php)
Jun 21 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 PHP
php项目中百度 UEditor 简单安装调试和调用
Jul 15 PHP
php调用自己java程序的方法详解
May 13 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
关于php开启错误提示的总结
Sep 24 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连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
php unlink()函数使用教程
2018/07/12 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
python字符串常用方法
2018/06/14 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
活动策划求职信模板
2014/04/21 职场文书
医学求职自荐信
2014/06/21 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
观后感开头
2015/06/19 职场文书
安全学习心得体会范文
2016/01/18 职场文书