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语法速查表
Dec 06 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 PHP
php比较多维数组中值的大小排序实现代码
Sep 08 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
PHP file_get_contents设置超时处理方法
Sep 30 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
Nov 22 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
Jul 21 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 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和ACCESS写聊天室(三)
2006/10/09 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
python中list常用操作实例详解
2015/06/03 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
文秘自荐信
2013/10/20 职场文书
千元咖啡店的创业计划书范文
2013/12/29 职场文书
求职意向书范文
2014/04/01 职场文书
三八妇女节活动总结
2014/05/04 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
房产分割协议书范文
2014/11/21 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers