Microsoft IIS 5.1 and IIS 6.0 ¶
This section contains instructions for manually setting up Internet Information Services (IIS) 5.1 and IIS 6.0 to work with PHP on Microsoft Windows XP and Windows Server 2003. For instructions on setting up IIS 7.0 and later versions on Windows Vista, Windows Server 2008, Windows 7 and Windows Server 2008 R2 refer to Microsoft IIS 7.0 and later.
Configuring IIS to process PHP requests ¶
Download and install PHP in accordance to the instructions described in manual installation steps
Configure the CGI- and FastCGI-specific settings in php.ini file as shown below:
Example #1 CGI and FastCGI settings in php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Download and install the » Microsoft FastCGI Extension for IIS 5.1 and 6.0. The extension is available for 32-bit and 64-bit platforms - select the right download package for your platform.
Configure the FastCGI extension to handle PHP-specific requests by running the command shown below. Replace the value of the "-path" parameter with the absolute file path to the php-cgi.exe file.
Example #2 Configuring FastCGI extension to handle PHP requests
cscript %windir%\system32\inetsrv\fcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:\PHP\php-cgi.exe"
This command will create an IIS script mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI extension. Also, it will configure FastCGI extension to use the executablephp-cgi.exe to process the PHP requests.
Impersonation and file system access ¶
It is recommended to enable FastCGI impersonation in PHP when using IIS. This is controlled by thefastcgi.impersonate directive in php.ini file. When impersonation is enabled, PHP will perform all the file system operations on behalf of the user account that has been determined by IIS authentication. This ensures that even if the same PHP process is shared across different IIS web sites, the PHP scripts in those web sites will not be able to access each others' files as long as different user accounts are used for IIS authentication on each web site.
For example IIS 5.1 and IIS 6.0, in its default configuration, has anonymous authentication enabled with built-in user account IUSR_ used as a default identity. This means that in order for IIS to execute PHP scripts, it is necessary to grant IUSR_ account read permission on those scripts. If PHP applications need to perform write operations on certain files or write files into some folders then IUSR_ account should have write permission to those.
To determine which user account is used by IIS anonymous authentication, follow these steps:
- In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
- Expand the list of web sites under the "Web Sites" node in the tree view, right-click on a web site that is being used and select "Properties";
- Click the "Directory Security" tab;
- Take note of a "User name:" field in the "Authentication Methods" dialog
To modify the permissions settings on files and folders, use the Windows Explorer user interface or icaclscommand.
Example #3 Configuring file access permissions
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Set index.php as a default document in IIS ¶
The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, follow these steps:
- In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
- Right-click on the "Web Sites" node in the tree view and select "Properties";
- Click the "Documents" tab;
- Click the "Add..." button and enter "index.php" for the "Default content page:".
FastCGI and PHP Recycling configuration ¶
Configure IIS FastCGI extension settings for recycling of PHP processes by using the commands shown below. The FastCGI setting instanceMaxRequests controls how many requests will be processed by a single php-cgi.exeprocess before FastCGI extension shuts it down. The PHP environment variable PHP_FCGI_MAX_REQUESTScontrols how many requests a single php-cgi.exe process will handle before it recycles itself. Make sure that the value specified for FastCGI InstanceMaxRequests setting is less than or equal to the value specified forPHP_FCGI_MAX_REQUESTS.
Example #4 Configuring FastCGI and PHP recycling
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -InstanceMaxRequests:10000 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000
Configuring FastCGI timeout settings ¶
Increase the timeout settings for FastCGI extension if there are applications that have long running PHP scripts. The two settings that control timeouts are ActivityTimeout and RequestTimeout. Refer to » Configuring FastCGI Extension for IIS 6.0 for more information about those settings.
Example #5 Configuring FastCGI timeout settings
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -ActivityTimeout:90 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -RequestTimeout:90
Changing the Location of php.ini file ¶
PHP searches for php.ini file in several locations and it is possible to change the default locations of php.inifile by using PHPRC environment variable. To instruct PHP to load the configuration file from a custom location run the command shown below. The absolute path to the directory with php.ini file should be specified as a value of PHPRC environment variable.
Example #6 Changing the location of php.ini file
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHPRC:"C:\Some\Directory\"
reference: http://php.net/manual/en/install.windows.iis6.php
Microsoft IIS 7.0 and later ¶
This section contains instructions for manually setting up Internet Information Services (IIS) 7.0 and later to work with PHP on Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 and Windows Server 2008 R2. For instructions on setting up IIS 5.1 and IIS 6.0 on Windows XP and Windows Server 2003 refer to Microsoft IIS 5.1 and IIS 6.0.
Enabling FastCGI support in IIS ¶
FastCGI module is disabled in default installation of IIS. The steps to enable it differ based on the version of Windows being used.
To enable FastCGI support on Windows Vista SP1 and Windows 7:
- In the Windows Start Menu choose "Run:", type "optionalfeatures.exe" and click "Ok";
- In the "Windows Features" dialog expand "Internet Information Services", "World Wide Web Services", "Application Development Features" and then enable the "CGI" checkbox;
- Click OK and wait until the installation is complete.
To enable FastCGI support on Windows Server 2008 and Windows Server 2008 R2:
- In the Windows Start Menu choose "Run:", type "CompMgmtLauncher" and click "Ok";
- If the "Web Server (IIS)" role is not present under the "Roles" node, then add it by clicking "Add Roles";
- If the "Web Server (IIS)" role is present, then click "Add Role Services" and then enable the "CGI" checkbox under "Application Development" group;
- Click "Next" and then "Install" and wait for the installation to complete.
Configuring IIS to process PHP requests ¶
Download and install PHP in accordance to the instructions described in manual installation steps
Configure the CGI- and FastCGI-specific settings in php.ini file as shown below:
Example #1 CGI and FastCGI settings in php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Configure IIS handler mapping for PHP by using either IIS Manager user interface or a command line tool.
Using IIS Manager user interface to create a handler mapping for PHP ¶
Follow these steps to create an IIS handler mapping for PHP in IIS Manager user interface:
- In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";
- In the IIS Manager user interface select the server node in the "Connections" tree view;
- In the "Features View" page open the "Handler Mappings" feature;
- In the "Actions" pane click "Add Module Mapping...";
- In the "Add Module Mapping" dialog enter the following:
- Request path: *.php
- Module: FastCgiModule
- Executable: C:\[Path to PHP installation]\php-cgi.exe
- Name: PHP_via_FastCGI
- Click "Request Restrictions" button and then configure the mapping to invoke handler only if request is mapped to a file or a folder;
- Click OK on all the dialogs to save the configuration.
Using command line tool to create a handler mapping for PHP ¶
Use the command shown below to create an IIS FastCGI process pool which will use php-cgi.exe executable for processing PHP requests. Replace the value of the fullPath parameter with the absolute file path to thephp-cgi.exe file.
Example #2 Creating IIS FastCGI process pool
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI ^ /+[fullPath='c:\PHP\php-cgi.exe']
Configure IIS to handle PHP specific requests by running the command shown below. Replace the value of thescriptProcessor parameter with the absolute file path to the php-cgi.exe file.
Example #3 Creating handler mapping for PHP requests
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers ^ /+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^ scriptProcessor='c:\PHP\php-cgi.exe',resourceType='Either']
This command creates an IIS handler mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI module.
Impersonation and file system access ¶
It is recommended to enable FastCGI impersonation in PHP when using IIS. This is controlled by thefastcgi.impersonate directive in php.ini file. When impersonation is enabled, PHP will perform all the file system operations on behalf of the user account that has been determined by IIS authentication. This ensures that even if the same PHP process is shared across different IIS web sites, the PHP scripts in those web sites will not be able to access each other's files as long as different user accounts are used for IIS authentication on each web site.
For example IIS 7, in its default configuration, has anonymous authentication enabled with built-in user account IUSR used as a default identity. This means that in order for IIS to execute PHP scripts, it is necessary to grant IUSR account read permission on those scripts. If PHP applications need to perform write operations on certain files or write files into some folders then IUSR account should have write permission to those.
To determine what user account is used as an anonymous identity in IIS 7 use the following command. Replace the "Default Web Site" with the name of IIS web site that you use. In the output XML configuration element look for the userName attribute.
Example #4 Determining the account used as IIS anonymous identity
%windir%\system32\inetsrv\appcmd.exe list config "Default Web Site" ^ /section:anonymousAuthentication
To modify the permissions settings on files and folders, use the Windows Explorer user interface or icaclscommand.
Example #5 Configuring file access permissions
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Set index.php as a default document in IIS ¶
The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, use this command:
Example #6 Set index.php as a default document in IIS
%windir%\system32\inetsrv\appcmd.exe set config ^ -section:system.webServer/defaultDocument /+"files.[value='index.php']" ^ /commit:apphost
FastCGI and PHP Recycling configuration ¶
Configure IIS FastCGI settings for recycling of PHP processes by using the commands shown below. The FastCGI setting instanceMaxRequests controls how many requests will be processed by a single php-cgi.exe process before IIS shuts it down. The PHP environment variable PHP_FCGI_MAX_REQUESTS controls how many requests a single php-cgi.exe process will handle before it recycles itself. Make sure that the value specified for FastCGIInstanceMaxRequests setting is less than or equal to the value specified for PHP_FCGI_MAX_REQUESTS.
Example #7 Configuring FastCGI and PHP recycling
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='c:\php\php-cgi.exe'].instanceMaxRequests:10000 %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.^ [name='PHP_FCGI_MAX_REQUESTS',value='10000']"
FastCGI timeout settings ¶
Increase the timeout settings for FastCGI if it is expected to have long running PHP scripts. The two settings that control timeouts are activityTimeout and requestTimeout. Use the commands below to change the timeout settings. Make sure to replace the value in the fullPath parameter to contain the absolute path to thephp-cgi.exe file.
Example #8 Configuring FastCGI timeout settings
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost
Changing the Location of php.ini file ¶
PHP searches for php.ini file in several locations and it is possible to change the default locations of php.inifile by using PHPRC environment variable. To instruct PHP to load the configuration file from a custom location run the command shown below. The absolute path to the directory with php.ini file should be specified as a value of PHPRC environment variable.
Example #9 Changing the location of php.ini file
appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:\php\php.exe',arguments=''].environmentVariables.^ [name='PHPRC',value='C:\Some\Directory\']" /commit:apphost
FastCGI for IIS 6.0: 在 IIS 6.0 也可以有超快的 PHP 執行引擎
本文將介紹如何在 IIS 6.0(Windows Server 2003 的 IIS)設定 FastCGI 模組,以支援在IIS 6.0 上應用 FastCGI 的 PHP 架站服務,這篇文章也同時適用於 IIS 5.1(Windows XP的IIS)。
FastCGI: 微軟的 CGI 噴射引擎
以前只要一聽到微軟的 IIS 伺服器,基本上只會聯想到 ASP 和 ASP.NET 等微軟自己的伺服器端 Web 應用程式開發平台,鮮少有人會想到其他廠商或社群所用的開發平台,像是PHP、Perl、JSP 或是其他的 CGI(Common Gateway Interface)應用程式,在 Internet開始發展之前,CGI 就已經存在於 Web 應用程式的開發,當時最火紅的 CGI 引擎之一就是 Perl,一直到現在也還是有不少的網站應用程式是使用它,當時 ASP 根本還沒出生,Cold Fusion 也不知在哪,更不用提 Java 的 JSP 了。
最早的 CGI 程式出現在 1993 年,由 NCSA 開發的 httpd(HTTP Daemon)上掛載的一支處理網頁內容的小程式,用的是 Unix 的 Shell Script,而且一開始也不是一支獨立的執行引擎,隨著 CGI 原型的開發,它才慢慢變化為一個獨立的行程,專門執行動態內容的網頁輸出用。當時 CGI 只有 C 和 C++ 可以開發,之後才慢慢的開始有較簡便的開發工具與語言出現,像是 Cold Fusion 也是一種伺服器端的 CGI 引擎。微軟的 ASP 技術則是在1994-95 年左右,在 Windows NT 3.51 上的 IIS 2.0 發表第一個版本,隨後在 Window NT 4.0 上大放光芒。雖然微軟的 IIS 給予了 ASP 以及後續的 ASP.NET 近似 100% 的充份支援,但是對其他的 CGI 引擎卻顯得不夠友善,因為 IIS 在發展的時候與 ASP 和 ASP.NET 配合的情境較多,而且微軟自己的官方網站群組也都是用 ASP 和 IIS,幾乎是沒有 IIS 以外的伺服器(如 Apache),然而 Apache HTTP Server 在每次的 Web Server 大調查中都是一直保持 50% 以上的佔有率,這點目前 IIS 仍然無法超越。
截至 2010 年四月份為止,IIS 的占有率為 24.97%,
而 Apache 占有率為 53.93%。
資料來源:http://news.netcraft.com/archives/2010/04/15/april_2010_web_server_survey.html
而 Apache 占有率為 53.93%。
資料來源:http://news.netcraft.com/archives/2010/04/15/april_2010_web_server_survey.html
同時微軟在 Windows Server 2008 推出之時,開始推廣 Microsoft Web Platform(We b 平台)產品線,訴求讓更多的軟體開發人員投入到 Windows Server 系列以及 IIS 7.0,但微軟也十分清楚,如果 IIS 對 CGI 的支援仍然薄弱的話,是無法說服非微軟平台的開發人員使用 Microsoft Web Platform 的,因此微軟以 FastCGI 協定為基礎,開發了在 IIS 7.0 上可以快速運行的 CGI 執行引擎。打破以往在 IIS 上 CGI 執行效能低落的問題,FastCGI 模組大幅提升了 CGI 的指令碼型應用程式(例如 PHP)在 IIS 上的執行速度(與原本的 CGI 引擎比較速度約加快了 4-8 倍)。
這套 FastCGI 模組是與 Windows Vista 和 Windows Server 2008 一起出貨(Windows 7 和 Windows Server 2008 R2 也是),但現在也可以在 IIS 6.0 以及 IIS 5.1 上使用了。
在 IIS 6.0 上安裝 FastCGI 模組以及 PHP 執行引擎
要在 IIS 6.0 上安裝 FastCGI,可以利用 Web Platform Installer 2.0 來安裝,或者是手動由 IIS.net 網站下載安裝,FastCGI for IIS 6 模組的安裝程式是一個 Windows Installer 的 MSI 安裝檔案,可以直接用它來安裝。FastCGI 模組可以直接與 IIS 6 的 Worker Process(w3wp.exe)整合,並且供應 CGI Scripts 正常且快速執行的應用程式環境,它就像是 ASP 的 asp.dll 以及 ASP.NET 的 aspnet_isapi.dll 一樣。
當 Web Platform Installer 安裝 FastCGI for IIS 6.0 完成時,就可以在 IIS 管理員的網頁延伸功能區中看到 FastCGI Handler:
若您是手動安裝 FastCGI for IIS 6.0 模組時,請注意是否在 IIS 中有加入 FastCGI Handler,並且有設定允許存取,若少了其中一個步驟時,PHP 應用程式將不會使用 FastCGI Handler 來處理 PHP 的程式。
接著,您可以到 http://www.php.net下載並安裝 PHP 5.2(或更新的版本),或者您也可以利用 Web Platform Installer 代勞這件事:
安裝 PHP 完成後,請在預設的網站下,新增一個 index.php 的檔案,並且輸入下列指令:
[PHP]
phpinfo();
?>
然後用瀏覽器開啟它,會看到 PHP 自動輸出的系統資訊頁:
當您看到這個頁面時,表示 FastCGI for IIS 6.0 模組已經安裝成功,您可以在 IIS 6.0 上執行各種PHP應用程式(包含WordPress、Drupal、osCommerce 或是 phpBB 這些著名的 PHP 應用程式套件,而這些套件也可以委由 Web Platform Installer 來代勞安裝的工作)。
若您是手動安裝 PHP,則您需要手動設定各網站的 PHP 關聯(.php 對應到 fcgiext.dll)才可以正常使用 FastCGI Handler 來處理 PHP 程式,您可以在網站的內容頁的『主目錄』頁籤中的『設定』按鈕,在『對應』頁籤中瀏覽清單,如果沒有副檔名為 .php 的設定,您可以按下『新增』,然後填入下列資訊:
設定欄位 | 值 |
執行檔 | %SYSTEMDIR%/inetsrv/fcgiext.dll |
副檔名 | .php |
指令動詞 | 由管理人員決定,或是設定 GET,POST,HEAD |
其他設定 | 勾選『指令碼引擎』以及『檢查檔案是否存在』。 |
若您想快速的設定上列的設定至所有網站,則可以利用 FastCGI Handler 所附的 fcgiext.js 指令碼檔案,利用 Windows Scripting Host 來自動化設定,例如下列指令碼:
cscript fcgiconfig.js -add -section:"PHP" -extension:php -path:"C:\PHP\php-cgi.exe"
若只要在特定網站中套用 FastCGI Handler 的設定,則可以在上列指令中加入 -site:[site id] 的參數,例如:
cscript fcgiconfig.js -add -section:"PHP" -extension:php -path:"C:\PHP\php-cgi.exe" –site:1
cscript fcgiconfig.js -add -section:"PHP" -extension:php -path:"C:\PHP\php-cgi.exe"
若只要在特定網站中套用 FastCGI Handler 的設定,則可以在上列指令中加入 -site:[site id] 的參數,例如:
cscript fcgiconfig.js -add -section:"PHP" -extension:php -path:"C:\PHP\php-cgi.exe" –site:1
設定 FastCGI 模組
當 FastCGI for IIS 6.0 安裝後,會在 %SYSTEMDIR%/inetsrv 資料夾中留下一個 fcgiext.ini 檔案,這個檔案可以允許管理人員針對 FastCGI 模組進行細部的設定,若應用程式或伺服器有安全性或效能考量時,可以在這裡設定。
使用 Web Platform Installer 2.0 安裝 PHP 的 fcgiext.ini 預設值為:
1.應用程式設定
FastCGI 的設定檔可以針對不同的應用程式控制不同的 Worker Process 執行內容的組態,就如同 ASP.NET 每一個應用程式集區(Application Pool)有各自的設定一樣,但 FastCGI 的應用程式集區設定必須要在 fcgiext.ini 中設定,您可以在一開始的 fcgiext.ini 中看到這樣的設定:
這裡的設定是告訴 FastCGI 針對哪支應用程式的哪個副檔名(或所有副檔名)的檔案要利用哪一個應用程式集區的設定,以上例而言:
- abc=Application 1 代表所有副檔名為 abc 的檔案處理要利用 Application 1 節區的設定。
- def:/lm/w3svc/xxxx/root/app1=Application 2 表示在 /lm/w3svc/xxxx/root/app1 應用程式中以 def 為副檔名的檔案處理要用 Application 2 節區的設定。
- *:/lm/w3svc/xxxx/root/app1=Application 2 表示在 /lm/w3svc/xxxx/root/app1 應用程式中除了以 def 為副檔名以外的所有檔案處理要用 Application 3 節區的設定。
- def:xxxx=Application 4 代表在應用程式 ID 為 xxxx 的網站中以 def 為副檔名的檔案處理要用 Application 4 節區的設定。
- *:xxxx=Application 5 代表在應用程式 ID 為 xxxx 的網站中除了以 def 為副檔名以外的所有檔案處理要用 Application 5 節區的設定。
- def=Application 6 代表若未符合上述規則且以 def 為副檔名的檔案處理要用 Application 6 節區的設定。
- *=Application 7 代表若未符合上述規則且除了以 def 為副檔名以外的所有檔案處理要用 Application 7 節區的設定。
雖然設定有點複雜,但是彈性卻是較高的。
2.FastCGI 環境設定
每一個應用程式節區都可以擁有自己的環境設定,每個環境的設定值都是 key=value 的方式,設定值有下列數種:
設定值 | 說明 | 預設值 |
Protocol | FastCGI 使用的通訊協定,可以是 Named Pipe 或 TCP | Named Pipe |
QueueLength | 應用程式集區中的執行個體可容納的要求數的長度,當要求數超出這個設定時,會擲回 Server To Busy 的 HTTP 狀態。 | 1000 |
MaxInstances | 允許在應用程式集區中存放的執行個體數量。 | 0(不限制個數) |
InstanceMaxRequests | 執行個體在關閉或回收前最大可處理的要求數,若要求到達此值時執行個體會由IIS回收。 | 1000 |
IdleTimeout | 執行個體在關閉或回收前可以閒置的最大時間,單位為秒。 | 300 |
RequestTimeout | 當執行個體正在處理要求的最大等待時間,單位為秒。 | 30 |
ResponseBufferLimit | 執行個體回傳資訊暫存的空間大小。 | 4194304 (4MB) |
FlushNamedPipe | 當 FastCGI 無法由 Named Pipe 讀取完整資料時,會強制對 Named Pipe 執行 Flush 以取得所有的資料。 | 0(不啟用) |
UnhealthyOnQueueFull | 當要求訊息的佇列滿了的時候,向 IIS 回報目前 FastCGI 的 Worker Process 為不健康的狀態。 | 0(不啟用) |
MonitorChangesTo | 監控指定的檔案是否發生變化,如果發生時就回收執行個體,此功能與 ASP.NET 的 Web.config 發生變化時會重新啟動的功能是一樣的。 | 空字串(不指定)。 |
StderrMode | 設定PHP的Standard Error行為(錯誤處理的方式),允許的值有: ReturnStderrIn500(回傳HTTP 500,並且內含詳細錯誤的回應資料流) ReturnGeneric500(回傳HTTP 500,但不含詳細錯誤的回應資料流) IgnoreAndReturn200(略過錯誤且回傳HTTP 200) TerminateProcess(將執行個體終止) | ReturnStderrIn500 |
SignalBeforeTerminateSeconds | 在執行個體終止前向應用程式發出事件信號,單位為秒。 | 0 |
ActivityTimeout | 執行個體處理要求的 I/O 動作的逾時時間。 | 70 |
結語
FastCGI 是 IIS 特別送給非 ASP 與 ASP.NET 的 Web 應用程式處理器的大禮,不但增加了 CGI 應用程式的執行速度,同時也將 CGI 應用程式納入集區管理的概念,讓它享有與 ASP/ASP.NET 應用程式相同的待遇,讓 PHP 或是其他 CGI 引擎的開發人員願意在 Windows Server(IIS 5.1 以上)上開發 CGI 的 Web 應用程式。
沒有留言:
張貼留言