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 强制性文件下载功能的函数代码(任意文件格式)
May 26 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 PHP
thinkphp实现面包屑导航(当前位置)例子分享
May 10 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
PHP浮点数精度问题汇总
May 13 PHP
php循环table实现一行两列显示的方法
Jun 04 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
twig模板获取全局变量的方法
Feb 05 PHP
php微信公众平台开发之微信群发信息
Sep 13 PHP
Laravle eloquent 多对多模型关联实例详解
Nov 22 PHP
关于laravel 子查询 & join的使用
Oct 16 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 mysql索引问题
2008/06/07 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
Python中的匿名函数使用简介
2015/04/27 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
eclipse创建python项目步骤详解
2019/05/10 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
电子信息专业学生自荐信
2013/11/09 职场文书
水电工岗位职责
2014/02/12 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
关于安全演讲稿
2014/05/09 职场文书
武夷山导游词
2015/02/03 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python