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程序--记数器
Oct 09 PHP
PHP中的类-什么叫类
Nov 20 PHP
不错的一篇面向对象的PHP开发模式(简写版)
Mar 15 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
php实现图片添加水印功能
Feb 13 PHP
php获取文件名后缀常用方法小结
Feb 24 PHP
PHP中preg_match函数正则匹配的字符串长度问题
May 27 PHP
php使用PDO获取结果集的方法
Feb 16 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
Jun 07 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 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面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
学习python (2)
2006/10/31 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
python装饰器使用实例详解
2019/12/14 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
大学毕业登记表自我鉴定
2013/10/09 职场文书
前台文员个人求职信范文
2014/01/05 职场文书
行政副总岗位职责
2014/02/23 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
计划生育工作总结2015
2015/04/03 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
网络研修心得体会
2016/01/08 职场文书
nginx请求限制配置方法
2021/07/09 Servers