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

FastCGI 不完全高级指南(PHP版,Windows平台)_PHP教程

Jul 13, 2016 am 10:52 AM
fastcgi php windows 平台 指南 問題 進階



问题
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

熱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

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
24
繼續使用PHP:耐力的原因 繼續使用PHP:耐力的原因 Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

laravel安裝代碼 laravel安裝代碼 Apr 18, 2025 pm 12:30 PM

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

IIS和PHP的兼容性:深度潛水 IIS和PHP的兼容性:深度潛水 Apr 22, 2025 am 12:01 AM

IIS和PHP可以兼容,通過FastCGI實現。 1.IIS通過配置文件將.php文件請求轉發給FastCGI模塊。 2.FastCGI模塊啟動PHP進程處理請求,提高性能和穩定性。 3.實際應用中需注意配置細節、錯誤調試和性能優化。

如果session_start()被多次調用會發生什麼? 如果session_start()被多次調用會發生什麼? Apr 25, 2025 am 12:06 AM

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

使用Laravel:使用PHP簡化Web開發 使用Laravel:使用PHP簡化Web開發 Apr 19, 2025 am 12:18 AM

Laravel優化Web開發流程的方法包括:1.使用路由系統管理URL結構;2.利用Blade模板引擎簡化視圖開發;3.通過隊列處理耗時任務;4.使用EloquentORM簡化數據庫操作;5.遵循最佳實踐提高代碼質量和可維護性。

怎樣在C  中處理高DPI顯示? 怎樣在C 中處理高DPI顯示? Apr 28, 2025 pm 09:57 PM

在C 中處理高DPI顯示可以通過以下步驟實現:1)理解DPI和縮放,使用操作系統API獲取DPI信息並調整圖形輸出;2)處理跨平台兼容性,使用如SDL或Qt的跨平台圖形庫;3)進行性能優化,通過緩存、硬件加速和動態調整細節級別來提升性能;4)解決常見問題,如模糊文本和界面元素過小,通過正確應用DPI縮放來解決。

作曲家:通過AI的幫助開發PHP 作曲家:通過AI的幫助開發PHP Apr 29, 2025 am 12:27 AM

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

怎樣卸載MySQL並清理殘留文件 怎樣卸載MySQL並清理殘留文件 Apr 29, 2025 pm 04:03 PM

要安全、徹底地卸載MySQL並清理所有殘留文件,需遵循以下步驟:1.停止MySQL服務;2.卸載MySQL軟件包;3.清理配置文件和數據目錄;4.驗證卸載是否徹底。

See all articles