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如何编写易读的代码
Jul 10 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
php对关联数组循环遍历的实现方法
Mar 13 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
CI框架整合widget(页面格局)的方法
May 17 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
Mar 15 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
PHP常量define和const的区别详解
May 18 PHP
在Laravel 中实现是否关注的示例
Oct 22 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP概述.
2006/10/09 PHP
使用字符串函数输出整数化的PHP版本号
2006/10/09 PHP
php实现天干地支计算器示例
2014/03/14 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
PHP自定义错误用法示例
2016/09/28 PHP
Zend Framework数据库操作技巧总结
2017/02/18 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
JavaScript 继承详解(一)
2009/07/13 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python合并字符串的3种方法
2015/05/21 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
Django之腾讯云短信的实现
2020/06/12 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
纠风工作实施方案
2014/03/15 职场文书
工地安全生产标语
2014/06/06 职场文书
在职员工证明书
2014/09/19 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
优秀员工事迹材料
2014/12/20 职场文书
中学教师教学工作总结
2015/08/13 职场文书