搜索
首页php教程php手册FastCGI 不完全高级指南(PHP版,Windows平台)

一、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_header

2、下载http://www.caraveo.com/fastcgi/fastcgi-0.6.zip并将其中的isapi_fcgi.dll解压缩到c:php目录下(不是必须在此目录,这里只是叙述方便)。

3、使用regedit.exe建立如下注册表项:

HKEY_LOCAL_MACHINE:SoftwareFASTCGI.php (必需)

4、在此项下建立如下键值:

字符串类型:AppPath,值为c:phpphp-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:phpisapi_fcgi.dll,并允许。应用程序池中的“最大工作进程数”请保持为1。

6、添加应用程序扩展映射关系:

1). 在Internet信息服务管理器中,选择网站或应用程序的根目录。

2). 打开目录属性页(右键选择"属性"),再选择"主目录"。

3). 点击"配置"按钮,选择"映射"Tab页。

4). 点击"添加...",在"可执行文件"设为: c:phpisapi_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:SoftwareFASTCGI.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服务启动账号一致。


               
               

文章网址:

随意转载^^但请附上教程地址。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
百度高级搜索怎么用百度高级搜索怎么用Feb 22, 2024 am 11:09 AM

百度高级搜索怎么用百度搜索引擎是目前中国最常用的搜索引擎之一,它提供了丰富的搜索功能,其中之一就是高级搜索。高级搜索可以帮助用户更精确地搜索到所需的信息,提高搜索效率。那么,百度高级搜索怎么使用呢?第一步,打开百度搜索引擎首页。首先,我们需要打开百度的官方网站,即www.baidu.com。这是百度搜索的入口。第二步,点击高级搜索按钮。在百度搜索框的右侧,有

Nginx中的FastCGI怎么配置优化Nginx中的FastCGI怎么配置优化May 21, 2023 am 08:16 AM

fastcgi:fastcgi是从cgi发展改进而来的。传统cgi接口方式的主要缺点是性能很差,因为每次http服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给http服务器。这在处理高并发访问时,几乎是不可用的。另外传统的cgi接口方式安全性也很差,现在已经很少被使用了。fastcgi接口方式采用c/s结构,可以将http服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当http服务器每次遇到动态程序时,可以将其直接交付给fastcg

深入剖析Pytest框架的高级用法和技巧深入剖析Pytest框架的高级用法和技巧Jan 13, 2024 am 10:32 AM

Pytest框架的高级用法和技巧详解引言:Pytest是一个功能强大且易于使用的Python测试框架,它提供了丰富的功能和灵活性,可以方便地组织、运行和管理测试用例。除了基本的测试功能外,Pytest还提供了一些高级用法和技巧,可以帮助开发者更好地编写和管理测试代码。本文将详细介绍Pytest框架的一些高级用法和技巧,并给出具体的代码示例。一、使用Pytes

Python高级学习路线详解Python高级学习路线详解Jun 10, 2023 am 10:46 AM

Python是一种强大的编程语言,已经成为许多领域中最流行的语言之一。从简单的脚本编写到复杂的Web应用程序和科学计算,Python都可以胜任。本文将介绍Python高级学习路线,提供了一条清晰的学习路径,帮助你掌握Python编程的高级技能。提高基础知识在进入Python高级学习之前,我们需要先回顾一下Python的基础知识。这包括Python的语法、数据

C语言程序由哪些要素组成?C语言程序由哪些要素组成?Feb 20, 2024 pm 04:27 PM

C语言程序由哪些要素组成?随着计算机科学的快速发展,编程语言也在不断地涌现和演变。而C语言作为一种较为常用的高级编程语言,被广泛使用于系统开发、嵌入式系统、游戏开发、算法设计等领域。要了解C语言程序的要素,我们需要从程序的结构、语法规则和关键要素三个方面来进行探讨。首先,让我们来看一下C语言程序的基本结构。一个C语言程序通常包含以下几个部分:预处理指令、函数

Go语言究竟是一种高级语言吗?Go语言究竟是一种高级语言吗?Mar 22, 2024 pm 09:48 PM

Go语言究竟是一种高级语言吗?Go语言是一种由Google开发的开源编程语言,于2009年首次发布。它被设计为一种支持高效并发编程的编译型语言,具有简洁、直观的语法和强大的标准库,适用于大规模系统的开发。那么,Go语言究竟是一种高级语言吗?本文将从多个角度进行探讨,并给出具体的代码示例来展示Go语言的特点。1.高级语言的定义在讨论Go语言是否属于高级语言之

深入学习:熟练掌握matplotlib高级绘制散点图的技巧深入学习:熟练掌握matplotlib高级绘制散点图的技巧Jan 17, 2024 am 08:19 AM

进阶指南:掌握Matplotlib高级散点图绘制技巧引言:Matplotlib是一个功能强大、灵活易用的绘图库,它提供了丰富的图形绘制功能。其中,散点图是一种常用的数据可视化方式,能够更直观地展示数据之间的关系。本文将介绍Matplotlib中绘制高级散点图的技巧,并提供具体的代码示例。一、基础散点图绘制在使用Matplotlib绘制散点图之前,需要先导入相

深入解读Linux chage命令的用法深入解读Linux chage命令的用法Feb 25, 2024 pm 03:00 PM

Linux操作系统是一个开源的操作系统,广泛应用于服务器和个人计算机中。其中有一些命令在系统管理和安全方面起着重要作用,其中就包括了chage命令。chage命令可以用来管理用户账户的密码过期策略,密码最短使用期限、最长使用期限、密码过期提醒等。在本文中,将详细解析Linuxchage命令的高级用法,并提供具体的代码示例帮助读者更好地理解和应用这个命令。1

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。