mod_fcgid是一個跟mod_fastcgi二進制兼容的Apache module。php
原 來的mod_fastcgi由於實現方式的限制,因此可能會建立了不少沒必要要的進程,而實際上只須要更少的進程就能處理一樣的請求。 mod_fastcgi的另一個問題是每個CGI的多個進程都共享同一個管道文件,全部到同一個fastcgi的通信都經過這個同名的管道文件進行, 這樣當出現通信錯誤的時候,根本不知道正在通信的是哪個fastcgi,因而也沒有辦法將這個有問題的進程殺死。數據庫
mod_fcgid嘗 試使用共享內存來解決這個問題。共享內存裏面有當前每一個fastcgi進程的信息(包括進程號,進程使用的管道文件名等),當 每次嘗試請求fastcgi工做的時候,Apache將會首先在共享內存裏面查詢,只有在共享內存裏面發現確實沒有足夠的fastcgi進程了,纔會建立 新的進程,這樣能夠保證當前建立的進程數量恰好可以處理客戶的請求。另外,因爲每個fastcgi進程使用不一樣名稱的管道文件,因此能夠在通信失敗的時 候知道到底哪一個fastcgi進程有問題,而可以儘早的將其剔除。安全
程序實現的目標ide
跟mod_fastcgi二進制兼容
只要在Apache中用mod_fcgid替換了mod_fastcgi,就能工做。原來的fastcgi程序不用從新編譯,當即能夠工做。測試
更嚴格的控制進程的建立
Apache中每個request handler都能經過共享內存知道當前系統fastcgi運行的狀況,這樣能夠防止過分的建立fastcgi進程,無謂的消耗系統的資源。spa
簡單清晰的進程建立速度控制策略線程
每 一個fastcgi都會維護一個計數器,這個計數器在程序建立和程序結束的時候都會增長,而這個計數器每秒會減1,直到0。當計數器的值高於某個 閥值的時候,程序就會中止建立,直到計數器的值回落。這樣既能夠保證在請求忽然增多的時候可以快速反應(特別是Apache剛啓動,須要大量建立程序的時 候),也能保證當fastcgi程序有問題,不斷重起的時候,重起的速度不會太高而消耗過多的系統資源。進程
自動檢測出有問題的進程內存
由於每一個fastcgi使用本身特定的管道文件,因此在通信錯誤的時候能夠輕易知道哪個程序出現問題,而儘早的將其剔除。資源
可移植性
遵 照Apache2的習慣,全部可移植的代碼都放到一塊兒,全部不可移植的代碼都在arch目錄下分開存放。當前已經測試過的系統包括 Linux , FreeBSD(已經包含入FreeBSD4和FreeBSD5的port中), Solaris, Windows 2000.
支持FastCGI方式運行的PHP
可 以直接支持以FastCGI方式運行的PHP。由於PHP如今還不能保證全部的擴展代碼都是線程安全的,因此並不建議在Apache2的線程模式 下使用mod_php。而以FastCGI方式運行的PHP則是其中一個解決辦法。另外,使用mod_fcgi還能夠在不修改任何PHP代碼的狀況下,獲 得數據庫鏈接池的功能,大大減小PHP進程到數據庫的鏈接。