基于php在各种web服务器的运行模式详解


Posted in PHP onJune 03, 2013

一、php在apache中运行模式
 
php在apache中一共有三种工作方式:CGI模式、FastCGI模式、Apache 模块DLL
以下分别比较:
1. CGI模式与模块模式比较:
php在apache中两种工作方式的区别(CGI模式、Apache 模块DLL)
这两种工作方式的安装:
PHP 在 Apache 2.0 中的 CGI 方式
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
# 对 PHP 4 用这行
Action application/x-httpd-php "/php/php.exe"
# 对 PHP 5 用这行
Action application/x-httpd-php "/php/php-cgi.exe"
PHP 在 Apache 2.0 中的模块方式
# 对 PHP 4 用这两行:
LoadModule php4_module "c:/php/php4apache2.dll"
# 别忘了从 sapi 目录中把 php4apache2.dll 拷贝出来!
AddType application/x-httpd-php .php
# 对 PHP 5 用这两行:
LoadModule php5_module "c:/php/php5apache2.dll"
AddType application/x-httpd-php .php
# 配置 php.ini 的路径
PHPIniDir "C:/php"
这两种工作方式的区别:
在CGI模式下,如果客户机请求一个php文件,Web服务器就调用php.exe去解释这个文件,然后再把解释的结果以网页的形式返回给客户机;
而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。
所以从某种角度上来说,以apache模块方式安装的 PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。
2. FastCGI运行模式分析:
FastCGI的工作原理是:
(1)、Web Server 启动时载入FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manager)】(IIS ISAPI或Apache Module);
(2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
(3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
(4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。
在上述情况中,你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些 都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

3. 为什么要使用FastCGI,而不是多线程CGI解释器?
这可能出于多方面的考虑,例如:
(1)、你无论如何也不能在windows平台上稳定的使用多线程CGI解释器,无论是IIS ISAPI方式还是APACHE Module方式,它们总是运行一段时间就崩溃了。奇怪么?但是确实存在这样的情况!
当然,也有很多时候你能够稳定的使用多线程CGI解释器,但是,你有可能发现网页有时候会出现错误,无论如何也找不到原因,而换用FastCGI方式 时这种错误的概率会大大的降低。我也不清楚这是为什么,我想独立地址空间的CGI解释器可能终究比共享地址空间的形式来得稳定一点点。
(2)、性能!性能?可能么,难道FastCGI比多线程CGI解释器更快?但有时候确实是这样,只有测试一下你的网站,才能最后下结论。原因嘛,我觉得 很难讲,但有资料说在Zend WinEnabler的时代,Zend原来也是建议在Windows平台下使用FastCGI而不是IIS ISAPI或Apache Module,不过现在Zend已经不做这个产品了。

4. FastCGI 模式运行PHP 的优点:
以 FastCGI 模式运行 PHP 有几个主要的好处。首先就是 PHP 出错的时候不会搞垮 Apache,只是 PHP 自己的进程当掉(但 FastCGI 会立即重新启动一个新 PHP 进程来代替当掉的进程)。其次 FastCGI 模式运行 PHP 比 ISAPI 模式性能更好(我本来用 ApacheBench 进行了测试,但忘了保存结果,大家有兴趣可以自己测试)。
最后,就是可以同时运行 PHP5 和 PHP4。参考下面的配置文件,分别建立了两个虚拟主机,其中一个使用 PHP5,另一个使用 PHP4。

LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP13.dll
ScriptAlias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3
ScriptAlias /fcgi-php4/ "d:/usr/local/php-4.3.11/"
FastCgiServer "d:/usr/local/php-4.3.11/php.exe"
Listen 80
NameVirtualHost *:80
DocumentRoot d:/www
Options Indexes FollowSymlinks MultiViews
ServerName php5.localhost
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"IndexOptions FancyIndexing FoldersFirst
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
Listen 8080
NameVirtualHost *:8080
DocumentRoot d:/www
Options Indexes FollowSymlinks MultiViews
ServerName php4.localhost
AddType application/x-httpd-fastphp4 .php
Action application/x-httpd-fastphp4 "/fcgi-php4/php.exe"
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all

使用上面的配置,访问 http://localhost/ 就使用 PHP5,而访问 http://localhost:8080/ 就使用 PHP4。所以只要合理配置,就可以让不同的虚拟主机使用不同版本的 PHP。
FastCGI 模式的一些缺点:
说完了好处,也来说说缺点。从我的实际使用来看,用 FastCGI 模式更适合生产环境的服务器。但对于开发用机器来说就不太合适。因为当使用 Zend Studio 调试程序时,由于 FastCGI 会认为 PHP 进程超时,从而在页面返回 500 错误。这一点让人非常恼火,所以我在开发机器上还是换回了 ISAPI 模式。
最后,在 Windows 中以 FastCGI 模式存在潜在的安

二、php 在nginx 中运行模式(nginx+PHP-FPM )目前理想选择
 
使用FastCGI方式现在常见的有两种stack:ligthttpd+spawn-fcgi; 另外一种是nginx+PHP-FPM(也可以用spawn-fcgi) 。
(1) 如上面所说该两种结构都采用FastCGI对PHP支持,因此HTTPServer完全解放出来,可以更好地进行响应和并发处理。因此lighttpd和nginx都有small, but powerful和efficient的美誉。

(2) 该两者还可以分出一个好坏来,spawn-fcgi由于是lighttpd的一部分,因此安装了lighttpd一般就会使用spawn-fcgi对php支持,但是目前有用户说ligttpd的spwan-fcgi在高并发访问的时候,会出现上面说的内存泄漏甚至自动重启fastcgi。即:PHP脚本处理器当机,这个时候如果用户访问的话,可能就会出现白页(即PHP不能被解析或者出错)。

另一个:首先nginx不像lighttpd本身含带了fastcgi(spawn-fcgi),因此它完全是轻量级的,必须借助第三方的FastCGI处理器才可以对PHP进行解析,因此其实这样看来nginx是非常灵活的,它可以和任何第三方提供解析的处理器实现连接从而实现对PHP的解析(在nginx.conf中很容易设置)。

nginx可以使用spwan-fcgi(需要一同安装lighttpd,但是需要为nginx避开端口,一些较早的blog有这方面安装的教程),但是由于spawn-fcgi具有上面所述的用户逐渐发现的缺陷,现在慢慢减少使用nginx+spawn-fcgi组合了。

c. 由于spawn-fcgi的缺陷,现在出现了新的第三方(目前还是,听说正在努力不久将来加入到PHP core中)的PHP的FastCGI处理器,叫做PHP-FPM(具体可以google)。它和spawn-fcgi比较起来有如下优点:

由于它是作为PHP的patch补丁来开发的,安装的时候需要和php源码一起编译,也就是说编译到php core中了,因此在性能方面要优秀一些;
同时它在处理高并发方面也优于spawn-fcgi,至少不会自动重启fastcgi处理器。具体采用的算法和设计可以google了解。

因此,如上所说由于nginx的轻量和灵活性,因此目前性能优越,越来越多人逐渐使用这个组合:nginx+PHP/PHP-FPM
三、IIS+ ISAPI模式这种模式适合开发环境中, 生产环境中用的较少。

四、总结
目前在HTTPServer这块基本可以看到有三种stack比较流行:
(1)Apache+mod_php5
(2)lighttp+spawn-fcgi
(3)nginx+PHP-FPM
三者后两者性能可能稍优,但是Apache由于有丰富的模块和功能,目前来说仍旧是老大。有人测试nginx+PHP-FPM在高并发情况下可能会达到Apache+mod_php5的5~10倍,现在nginx+PHP-FPM使用的人越来越多。

PHP 相关文章推荐
织梦模板标记简介
Mar 11 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
PHP基础知识介绍
Sep 17 PHP
PHP Curl多线程原理实例详解
Nov 06 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
PHP实现更新中间关联表数据的两种方法
Sep 01 PHP
PHP获取当前页面URL函数实例
Oct 22 PHP
PHP实现从远程下载文件的方法
Mar 12 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
Apr 04 PHP
php处理静态页面:页面设置缓存时间实例
Jun 22 PHP
详解PHP素材图片上传、下载功能
Apr 12 PHP
PHP运行模式的深入理解
Jun 03 #PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 #PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
Jun 03 #PHP
基于php-fpm的配置详解
Jun 03 #PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 #PHP
基于PHP一些十分严重的缺陷详解
Jun 03 #PHP
spl_autoload_register与autoload的区别详解
Jun 03 #PHP
You might like
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
php中将网址转换为超链接的函数
2011/09/02 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
yii分页组件用法实例分析
2015/12/28 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
python2.7实现爬虫网页数据
2018/05/25 Python
python urllib爬虫模块使用解析
2019/09/05 Python
keras的三种模型实现与区别说明
2020/07/03 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
超市促销实习自我鉴定
2013/09/23 职场文书
护士毕业生自荐信
2014/02/07 职场文书
数学检讨书1000字
2014/02/24 职场文书
厨师长岗位职责
2014/03/02 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL