搜尋
首頁後端開發php教程FastCGI 不完全高级指南(PHP版,Windows平台)_PHP教程



问题
FastCGI 不完全高级指南(PHP版,Windows平台)
解决方法
一、FastCGI是什么?
  FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。
FastCGI的官方站点在[url=http://www.fastcgi.com/]链接标记http://www.fastcgi.com[/url]

  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、下载[url=http://www.caraveo.com/fastcgi/fastcgi-0.6.zip]链接标记http://www.caraveo.com/fastcgi/fastcgi-0.6.zip[/url]并将其中的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、下载[url=http://www.fastcgi.com/dist/mod_fastcgi-2.4.2-AP20.dll]链接标记http://www.fastcgi.com/dist/mod_fastcgi-2.4.2-AP20.dll[/url],放到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服务启动账号一致。


网友建意:
收藏……
网友建意:
收藏了
不过我用FastCGI经常挂掉,好几台机器测试都一样,不知道原因出在哪里
网友建意:
官方下载地址:[url=http://www.fastcgi.com/dist/]链接标记http://www.fastcgi.com/dist/[/url]
版本已经升级到2.4.6了,楼主的下载地址是不行的,这文章应该是比较老的

[url=http://www.111cn.cn/html/30/n-34030.html]链接标记http://www.111cn.cn/html/30/n-34030.html[/url] 这文章看看
Windows 下有两种方法使 PHP 工作于 Apache 2.0.x 之中。一种是 使用 CGI 可执行程序,另一种是适用 Apache 模块的 DLL。
所以从某种角度上来说,以apache模块方式安装的 PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。

问题:以apache模块方式安装的 PHP能不能使用fastcgi,也就是两个都以apache模块方式加载,安装了运行正常,但不知道两者使用有什么区别?

FastCGI的Apache模块有一些问题,比如会烂开进程,挂掉后也杀不掉,导致很不稳定,好在有FCGID这个解决办法,不至于让FCGI走向末路^^

http://fastcgi.coremail.cn/index.cn.htm

[ ]
网友建意:
木有用过
网友建意:
mark
网友建意:
拿走了啊,[img]http://www.111cn.cn/bbs/images/smilies/default/lol.gif[/img]
网友建意:
good!
网友建意:
nice...........那就是APACHE MODEL好于FCGI咯。。。。。。。。。。 [img]http://www.111cn.cn/bbs/images/smilies/default/33.gif[/img] [img]http://www.111cn.cn/bbs/images/smilies/default/33.gif[/img][img]http://www.111cn.cn/bbs/images/smilies/default/33.gif[/img]
网友建意:
占楼学习

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/632516.htmlTechArticle问题 FastCGI 不完全高级指南(PHP版,Windows平台) 解决方法 一、FastCGI是什么? FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),