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调用Oracle存储过程的方法
Sep 12 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
基于php中使用excel的简单介绍
Aug 02 PHP
thinkphp中的url跳转用法分析
Jul 12 PHP
PHP批量删除jQuery操作
Jul 23 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
Jun 05 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
Jul 24 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
PHP单元测试配置与使用方法详解
Dec 27 PHP
PHP代码覆盖率统计详解
Jul 22 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 01 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中sprintf与printf函数用法区别解析
2014/02/17 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
php简单日历函数
2015/10/28 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
2017/05/15 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
使用JQuery进行跨域请求
2010/01/25 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
python写日志封装类实例
2015/06/28 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
python判断数字是否是超级素数幂
2018/09/27 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
公司员工的自我评价范例
2013/11/01 职场文书
医学生职业规划范文
2014/01/05 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
奥利奥广告词
2014/03/20 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
委托书的样本
2015/01/28 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书