IIS 7.5 - 建立 PHP 執行環境

這篇文章主要是介紹如何在 IIS 上手動設定 PHP 的執行環境,雖然有 Web Platform Installer (WebPI) 可以自動安裝,但是手動安裝可以自己掌握需要安裝的項目。

檔案準備

Thread Safe 與 Non Thread Safe 的選擇
設定 FastCGI 以裝載 PHP 應用程式 (IIS 7) 提到:

建議您搭配 IIS 7 FastCGI 使用 PHP 的非安全執行緒組建。 PHP 的非安全執行緒組建由於不進行任何執行緒安全性檢查,所提供的效能明顯比標準組建高。 這些檢查並非必要,因為 FastCGI 可保證單一執行緒執行環境。

PHP For Windows 也提到:

If you are using PHP as FastCGI with IIS you should use the Non-Thread Safe (NTS) versions of PHP.

所以就照建議選擇 Non Thread Safe,Windows 的 PHP x64 版還屬於實驗性質,暫時就先不考慮,因為是使用 VC11 編譯,所以必須安裝 Visual Studio 2012 的 Visual C++ 可轉散發套件。

安裝 Visual Studio 2012 Update 4 的 Visual C++ 可轉散發套件

使用 VC11 編譯的 PHP 需安裝 Visual Studio 2012 的 Visual C++ 可轉散發套件,安裝過程就一直點選下一步。

解壓縮 PHP 檔案

  • 解壓縮下載回來的 PHP,本例是放在 C:\Program Files (x86)\PHP,不過建議路徑中不要有空白,有時候會帶來困擾。
  • 複製 php.ini-production 成為 php.ini。

設定 PHP (php.ini)

extension_dir = "C:\Program Files (x86)\PHP\ext"
# Extension 路徑。

error_log = "C:\Windows\Temp\php_errors.log"
# 錯誤記錄檔路徑。

upload_tmp_dir = "C:\Windows\Temp"
# 檔案上傳暫存路徑,非必要,不設定時會存在預設的地方。

session.save_path = "C:\Windows\Temp"
# Session 存放路徑,非必要,不設定時會存在預設的地方。

open_basedir = "根目錄"
# 所有站台的根目錄,程式若存取這個目錄以外的檔案將會出錯。
# 如果有多站台時可選擇的方式:
#   1. 用:分隔目錄。
#   2. 不設定,在 IIS 建立處理常式對應時當作引數傳入 (建議)。

date.timezone = "Asia/Taipei"
# 時區。

upload_max_filesize = 2M
# 檔案上傳的大小限制,預設是 2MB,視需要調整。

post_max_size = 8M
# POST 到網站的資料大小限制,預設是 8MB,視需要調整。
# 需比 upload_max_filesize 大,因為 POST 時不只有檔案資料而已。

extension = xxx.dll
# 設定要載入的 extension。
# Windows Extensions 區段有 extension 的清單,以 extension = xxx.dll 的形式存在。
# 啟用需要的 extension 只要取消註解 (;) 就可以啟用。
# 例如需要 pdo_mysql.dll,取消註解改成 extension=php_pdo_mysql.dll 即可。

cgi.force_redirect = 0
cgi.fix_pathinfo = 1
fastcgi.impersonate = 1
fastcgi.logging = 0
# CGI 及 FastCGI 設定,在 IIS 上執行時需要。

安裝 IIS CGI 服務

Windows Server 2008 R2

  • 開啟 [伺服器管理員],在左側樹狀目錄選擇 角色 > 網頁伺服器(IIS)。
  • 點選 [新增角色服務]。
  • 安裝 網頁伺服器 > 應用程式開發 > CGI 服務。

Windows 7

  • 開啟 [控制台] > [程式與功能] > [開啟或關閉 Windows 功能]
  • 安裝 Internet Information Services > World Wide Web 服務 > 應用程式開發功能 > CGI 功能

設定 IIS 處理 PHP 請求(共用同一個 FastCGI 應用程式的作法)

開啟 Internet Information Services (IIS) 管理員。

建立 FastCGI 應用程式

  • 進入伺服器層級的 [FastCGI 設定]。
  • 點選 [新增應用程式]。
    • 完整路徑: C:\[PHP路徑]\php-cgi.exe
    • 例項 MaxRequests: 10000
    • 環境變數: 點一下...,開啟 EnvironmentVariables 集合編輯器,新增一組環境變數

      Name: PHP_FCGI_MAX_REQUESTS
      Value: 10000
      • instanceMaxRequests 及 PHP_FCGI_MAX_REQUESTS 是設定 FastCGI 及 PHP 的處理序回收行為。
      • 必須讓 FastCGI 在原生 PHP 回收啟動前先回收 php-cgi.exe 處理序,instanceMaxRequests 的值必須小於或等於 PHP_FCGI_MAX_REQUESTS,確保原生 PHP 處理序回收邏輯永遠不會啟動。

設定處理常式對應處理 PHP 請求

  • 建立好 FastCGI 應用程式之後,必須讓 IIS 可以正確處理 PHP 請求。
  • 進入伺服器層級的 [處理常式對應]。(如果有多個站台但只想讓特定的站台支援 PHP,在站台節點選擇你要的站台。)
  • 點選 [新增模組對應]。
    • 要求路徑: *.php
    • 模組: FastCgiModule
    • 執行檔: "C:\[PHP路徑]\php-cgi.exe"(必須和新增 FastCGI 應用程式時輸入的 [完整路徑] 相同)
    • 名稱: PHP via FastCGI
    • 要求限制

      在 [對應] 頁籤勾選 [只有當要求對應到下列項目時才啟動處理常式]
      選擇 [檔案或資料夾]
    • 點選確定,出現以下訊息請點選 [否],因為在上一個步驟已經建立好了。

      是否要為此執行檔建立 FastCGI 應用程式?按一下[是],即可將項目加入 FastCGI 集合,並使此執行檔以 FastCGI 應用程式的身分執行。

設定 IIS 處理 PHP 請求(每個站台有自己的 FastCGI 應用程式的作法)

如果你習慣一個站台分配一個專屬的應用程式集區,那可以考慮這種作法,一個 FastCGI 應用程式池是由完整路徑與引數組合的字串當作識別,藉由設定不同的引數可以讓每個網站有自己的 FastCGI 應用程式池。

建立 FastCGI 應用程式

  • 完整路徑: C:\[PHP路徑]\php-cgi.exe
  • 引數: -d open_basedir=[網站程式路徑]
    例如 C:\Websites\Website1\
  • 其餘的參數請照之前的說明設定。

設定處理常式對應處理 PHP 請求

  • 進入 [處理常式對應],新增模組對應(因為是針對個別站台,所以必須在站台層級設定)。
  • 執行檔: [完整路徑]|[引數]
    例如 C:\[PHP路徑]\php-cgi.exe|-d open_basedir=C:\Websites\Website1\
    如果路徑中有空白字元,需用 " (雙引號) 包起來。
  • 其餘的參數請照之前的說明設定。
  • 使用IIS管理員新增時,執行檔參數最後面可能會多" (") 字元,必須刪除。
    • 開啟 站台根目錄\web.config
    • handlers 區段找到剛剛新增的項目,確認 scriptProcessor 參數等於[完整路徑]|[引數]
      <handlers>
          <add name="PHP via FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\[PHP路徑]\php-cgi.exe|-d open_basedir=C:\Websites\Website1\&quot;" resourceType="Either" />
      </handlers>
      

設定預設文件

這一步不是必要的,如果訪客瀏覽時沒有指定檔名,IIS 會依序尋找清單上的檔案。

  • 進入 [預設文件]。
  • 加入 index.php

設定網站資料夾的權限

  • IUSR

    • 讀取和執行
    • 列出資料夾內容
    • 讀取

    子目錄或檔案若是需要寫入時再加上修改權限

  • IIS AppPool\應用程式集區名稱 或 IIS_IUSRS

    • 讀取和執行
    • 列出資料夾內容
    • 讀取

備註:

  • 若設定 open_basedir 後發生錯誤,試著將 open_basedir 上一層的目錄賦予 IUSR 及 IIS AppPool\應用程式集區名稱權限。

測試

  • 將以下內容存成 info.php 放到網站根目錄

    1
    2
    3
    <?php
    phpinfo();
    ?>
  • 使用瀏覽器開啟 http://localhost/info.php ,若看到 PHP 資訊就表示安裝成功

  • 刪除 info.php

Reference

Windows 系统下的安装 - 手工安装步骤
http://tw1.php.net/manual/zh/install.windows.manual.php
設定 FastCGI 以裝載 PHP 應用程式 (IIS 7)
http://technet.microsoft.com/zh-tw/library/dd239230%28v=ws.10%29.aspx
如何在 IIS 建立 PHP 程式檔案
https://www.microsoft.com/taiwan/technet/iis/learn/iis_php_establish.aspx
Using FastCGI to Host PHP Applications on IIS 7
http://www.iis.net/learn/application-frameworks/install-and-configure-php-applications-on-iis/using-fastcgi-to-host-php-applications-on-iis
修改PHP程序高级FastCGI设置
http://winsystem.ctocio.com.cn/101/9477601.shtml