FastCGI 不完全高级指南(PHP版,Windows平台)
作者:zealy
一、FastCGI是什么?
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。
FastCGI的官方站点在http://www.fastcgi.com
FastCGI的工作原理是:
1、Web Server 启动时载入FastCGI进程管理器(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)可以工作。
二、为什么要使用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已经不做这个产品了。
三、不使用FastCGI的理由
1、多进程比多线程消耗更多的服务器内存,php-cgi.exe解释器每进程消耗7至25兆内存,将这个数字乘以50或100试试。
2、性能。确实有时候多线程CGI解释器更快,呵呵,而且有时候,它也很稳定。
3、CGI?听起来就很土,呵呵
四、IIS FastCGI配置方法
1、首先确定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持,如果你想在早期版本中工作,需要重新编译它。我们假设PHP安装在c:\php,支持FastFCGI的可执行文件名是php-cgi.exe。
注意:建议在Php.ini中关闭cgi.force_redirect,启用fastcgi.impersonate,启用cgi.rfc2616_headers。
2、下载http://www.caraveo.com/fastcgi/fastcgi-0.6.zip并将其中的isapi_fcgi.dll解压缩到c:\php目录下(不是必须在此目录,这里只是叙述方便)。
3、使用regedit.exe建立如下注册表项:
HKEY_LOCAL_MACHINE:Software\FASTCGI\.php (必需)
4、在此项下建立如下键值:
字符串类型:AppPath,值为c:\php\php-cgi.exe (必需)
字符串类型:BindPath,值为php-fcgi (必需)
以下是可选配置键值:
DWORD类型:StartServers,启动时默认启动的解释器个数,默认值5
DWORD类型:MaxServers,最大解释器个数,默认25
DWORD类型:IncrementServers,当解释器不够用时增量个数,默认2
DWORD类型:Timeout,增量解释器(超出StartServers数目的)存活时间,默认600(秒)
DWORD类型:ThreadPoolSize,线程池大小,仅IIS下有效,默认10
DWORD类型:Impersonate,仅IIS有效,如果为1,使用IIS安全标志,为0则关闭此特性。不要关闭它除非你不担心安全问题。默认1
DWORD类型:MaxPostData,Post数据预读Byte限制,默认0
DWORD类型:BypassAuth,仅IIS有效,如果为1并且isapi_fcgi.dll被配置为IIS Filter,同时IIS被配置为使用BASIC Authentication,这将强制所有认证请求使用IIS匿名用户。这一选项的目的是允许脚本实现自己的安全机制。默认0
BINARY类型:CustomVars,附加环境变量值,新行分隔,Null结束
5、如果是IIS6,添加一个Web服务扩展指向c:\php\isapi_fcgi.dll,并允许。应用程序池中的“最大工作进程数”请保持为1。
6、添加应用程序扩展映射关系:
1). 在Internet信息服务管理器中,选择网站或应用程序的根目录。
2). 打开目录属性页(右键选择“属性”),再选择“主目录”。
3). 点击“配置”按钮,选择“映射”Tab页。
4). 点击“添加...”,在“可执行文件”设为: c:\php\isapi_fcgi.dll,扩展名设为.php,一定要选择“确认文件是否存在”,然后“确定”保存设置。
5). 再同样添加对.php3或.phtml扩展名的支持(可选)。
6). 保存设定并重新启动IIS。
7、测试一下,同时请求多个Web页面,然后察看任务管理器中的进程,页面完成后php-cgi.exe进程持续运行并不退出。
五、Apache配置方法
1、首先确定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持,如果你想在早期版本中工作,需要重新编译它。我们假设PHP安装在c:\php,支持FastFCGI的可执行文件名是php-cgi.exe。
注意:建议在Php.ini中打开cgi.force_redirect,关闭fastcgi.impersonate,关闭cgi.rfc2616_headers。
2、下载http://www.fastcgi.com/dist/mod_fastcgi-2.4.2-AP20.dll,放到Apache 2.x的Modules目录中。
3、确定Apache 2.x在CGI方式下可以正常运行PHP。httpd.conf中存在如下几行:
ScriptAlias /php/ "c:/php/"
Action application/x-httpd-php "/php/php-cgi.exe"
SetEnv PHPRC "C:/php"
AddType application/x-httpd-php .php
4、在httpd.conf中添加:
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll
# 说明:此处的 -processes 3 表示启动三个 php-cgi.exe 进程,
# 关于 FastCgiServer 的详细参数请参考 FastCGI 文档。
FastCgiServer "c:/php/php-cgi.exe" -processes 3
5、重新启动Apache,测试同上。
六、高级配置
设想这样一种场景,你的服务器上同时跑Apache 2和IIS 6,两个Web服务器都跑php应用。那么,有如下三种可能:
A、php使用iis isapi和apache module安装,均为多线程方式运行。这个和FastCGI没有关系。
B、其中一个服务器使用FastCGI方式,另一个使用多线程方式。这个能运行正常。
C、两个均使用FastCGI方式,这个往往不正常。一般表现为:
两个服务器各自启动一些php-cgi.exe进程,然后服务器之一不解释php页面,或者隔一会儿就派生新的php-cgi.exe进程(可怕呀)。
为什么呢?我想大概是因为上面使用的两个东西(iis isapi和apache module)的作者大概并没有想过要和对方同时使用吧,呵呵。
想了想,Apache 2和IIS 6如果可以共用一批php-cgi.exe解释器就好了,既不浪费内存,估计也不会有调度问题了。
经过研究和测试证明,这个想法是可行的。但是,由于Shane Caraveo并未在ISAPI DLL中提供使用外置FastCGI服务的功能,因此在此场景中只能是由IIS负责启动和管理php-cgi.exe,然后配置Apache去使用这些受IIS管理的php-cgi.exe进程。
配置方法:
1、按上述四中的方法配置IIS FastCGI。
2、基本按上述五中的方法配置Apache FastCGI,五.4改为在httpd.conf中添加:
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll
# 使用外部FastCGI服务器,请参考 FastCGI 文档。
FastCgiExternalServer "c:/php/php-cgi.exe" -socket "php-fcgi"
注意:-socket参数后的值必须与HKEY_LOCAL_MACHINE:Software\FASTCGI\.php中BindPath的值一致,这样两个FastCGI进程管理器才会使用同一个命名管道连接php-cgi.exe。
注意:此配置中php-cgi.exe进程只受IIS中的FastCGI进程管理器管理,Apache的繁忙请求并不会使IIS中的FastCGI调度更多的php-cgi.exe进程。因此,在IIS中配置FastCGI时应当使StartServers值足够大,以避免php解释器数量不足。同样带来的问题是,如果IIS关闭了,那么Apache就会找不到Php解释器了,这个要留心。
由此带来的一个问题是:此时的php.ini中cgi.force_redirect、fastcgi.impersonate、cgi.rfc2616_headers应该怎么设定呢?这个留给大家去思考吧……呵呵
另外一个可能遇到的问题是,IIS非常空闲,一段时间后由IIS启动的php-cgi.exe退出了,则apache就解释不了Php了,怎么办呢?这时可以访问一下iis网站,php-cgi.exe就又起来了,晕哦。一个建议是使用IIS 6的进程池管理,在应用程序池中关掉“空闲超时”,并且,在“应用程序池标识”中将运行账号设定为与Apache服务启动账号一致。
此内容的Trackback地址: http://blogme.cn/trackback/6529
关于FastCGI的网友通信
from 博客基地 - 菠萝菠萝蜜 on 周一, 2006-03-20 14:27
日前有网友发邮件探讨FastCGI的有关问题,整理了一下,觉得还是有些价值,征得对方同意后,发在这里,以飨来者。 back dream: 想问你个问题: 使用IIS+FastCGI,php+EA,一直以来被一个问题困
分享到:
相关推荐
- **Apache**: Apache是一款广泛使用的开源Web服务器软件,支持多种操作系统如Windows、Linux等。它具有强大的功能及高度可定制性,可通过各种模块扩展其功能。 - **FastCGI**: FastCGI是一种通用网关接口,用于HTTP...
在Windows Server 2003上安装PHP,你需要配置IIS(Internet Information Services)作为Web服务器,以便能够处理PHP脚本。以下是一个详尽的步骤指南: 1. **下载PHP**: 首先,访问PHP官方网站(www.php.net)下载...
在Windows 2003操作系统中手动安装配置PHP5是一个涉及多个步骤的过程,这个过程能够确保系统的稳定性并避免使用预封装安装包时可能出现的问题。PHP5的安装可以选择使用安装程序或者手动配置,但官方推荐手动安装,...
综上所述,IBM Net.Data OS-2版、Windows NT版和UNIX版的管理与程序设计指南是一部全面而详细的指南,不仅覆盖了基本的使用方法,还深入探讨了高级特性和技术细节,对于希望在不同平台上有效利用Net.Data的开发者来...
总的来说,《PHP与SQL Server 2000架构Windows Web数据库实务》是一本全面介绍如何在Windows环境下使用PHP与SQL Server 2000进行Web开发的实用指南,对于想要深入理解和掌握这一领域的开发者来说,具有很高的参考...
**PHP5.3.13安装指南** PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,尤其适用于Web开发,可以嵌入到HTML中使用。PHP5.3.13是该语言的一个版本,发布于2012年,它引入了一些新特性和改进,包括更好...
【win2003-IIS6PHP5MySQL5Zend-OptimizerphpMyAdmin图文安装指南】 在Windows Server 2003环境下搭建一个基于IIS6的Web服务器,我们需要配置PHP5、MySQL5和Zend Optimizer,并安装phpMyAdmin来管理数据库。这个过程...
3. PHP-FPM 安装配置:可以使用 PHP-FPM 作为 FastCGI server,提供 PHP支持。 Nginx 的一些常见问题和解决方案: 1. Nginx 安装问题:可以检查安装日志,查看安装过程中的错误信息。 2. Nginx 配置问题:可以检查...
通过遵循上述指南,用户可以顺利地在Windows平台上完成QGIS源码的编译工作,从而获得一个定制化的GIS应用系统。此外,对于开发人员来说,理解这些构建过程有助于更好地参与到QGIS项目中去,贡献自己的力量。
**PHP for IIS 配置指南** 在Windows操作系统上,Internet Information Services (IIS) 是一个常见的Web服务器,用于托管动态网站和应用程序。PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,常与IIS...
- 若要实现更高级的功能,如URL重写,可以考虑安装和配置PHP的FastCGI扩展,如mod_rewrite,这将使得URL更简洁,利于SEO优化。 - 另外,你还可以安装和配置数据库扩展,如mysqli或PDO,以连接MySQL等数据库,实现...
【PHP运行环境傻瓜安装包】是一款专为初学者或非专业IT人员设计的便捷工具,旨在简化PHP在Windows系统上的部署过程。该安装包特别适用于已经安装了Internet Information Services (IIS) 的用户,通过它,用户可以...
以上就是使用VMware 8.0安装Windows Server 2008 32位版,并准备配置IIS和Tomcat整合环境的详细步骤。需要注意的是,整个过程中可能会遇到各种问题,因此,及时查阅官方文档和在线论坛是解决这些问题的关键。
【IIS7.5PHP5.3.10ZendGuardLoader配置】是关于在Windows操作系统上,特别是使用IIS7.5作为Web服务器,集成PHP5.3.10版本和Zend Guard Loader的一个详细配置过程。这个配置文档适用于需要在IIS环境中运行经过Zend ...
- 打开“控制面板” > “系统和安全” > “系统” > “高级系统设置” > “环境变量”。 - 在“系统变量”列表中找到“Path”变量,点击“编辑”按钮,在变量值末尾添加`;C:\php`。 4. **测试安装**:打开命令提示...
【IIS服务器在Win7环境下配置指南】 在开发过程中,为软件提供Web访问功能是非常重要的,这使得用户可以通过标准浏览器查看远程运行的应用程序。在Windows操作系统中,最常用的Web服务器软件是IIS(Internet ...
PHP通常与Apache或Nginx web服务器配合使用,并且需要安装PHP解析器,如PHP-FPM(FastCGI Process Manager)。在Windows系统中,可以使用XAMPP或WAMP这样的集成开发环境,它们包含了Apache、MySQL和PHP等组件,一键...
这个文档很可能提供了详细的步骤指南,包括如何安装和配置MySQL或其他数据库连接、设置SMTP服务器进行邮件发送、安装和配置常见的PHP扩展(如gd、mysqli、curl等),以及解决可能出现的问题和故障排除技巧。...
**PHP 5.4 安装与配置指南** PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,尤其适用于Web开发。PHP 5.4是该语言的一个重要版本,引入了许多新特性,增强了性能并优化了开发体验。本文将详细介绍...
在未来的内容中,我们将继续探讨更多关于Zend Debugger的高级配置和使用技巧,敬请期待。 ### 附录 - **环境配置**:确保在安装前已经正确配置好PHP环境。 - **兼容性问题**:在不同版本的PHP中,Zend Debugger的...