Microsoft Windows 下的 Sun,iPlanet 和 Netscape 伺服器

本節包括針對在 Windows 下 Sun Java System web 伺服器,Sun ONE web 伺服器,iPlanet 和 Netscape 伺服器的 PHP 安裝說明與提示。

自 PHP 4.3.3 起可以通過 NSAPI 模組使用 PHP 腳本來產生定制目錄清單於錯誤頁面。也可以使用為相容 Apache 的附加函數。目前使用的 web 伺服器的支援請閱讀有關子請求的說明

Sun,iPlanet 和 Netscape 伺服器的 CGI 模式安裝

要將 PHP 安裝為 CGI 處理器,按以下步驟進行:

  • php4ts.dll 複製到 systemroot(即 Windows 的安裝目錄)

  • 在指令行做檔案關聯,輸入以下兩行指令:
    assoc .php=PHPScript
    ftype PHPScript=c:\php\php.exe %1 %*

  • 在 Netscape Enterprise Administration Server 中建一個空的 shellcgi 目錄並隨即移除(此步驟在 obj.conf 中新增了 5 行重要指令以容許 web 伺服器處理 shellcgi 腳本)。

  • 在 Netscape Enterprise Administration Server 中新增一個新的 MIME 類型(Category: type,Content-Type: magnus-internal/shellcgi,File Suffix: php)。

  • 對每個要運行 PHP 的 web 伺服器案例都進行以上步驟。

更多將 PHP 設定為 CGI 可執行程式的內容見:http://benoit.noss.free.fr/php/install-php.html

Sun,iPlanet 和 Netscape 伺服器的 NSAPI 模式

要將 PHP 以 NSAPI 模式安裝,按以下步驟進行:

  • php4ts.dll 複製到 systemroot(即 Windows 的安裝目錄)

  • 在指令行做檔案關聯,輸入以下兩行指令:
    assoc .php=PHPScript
    ftype PHPScript=c:\php\php.exe %1 %*

  • 在 Netscape Enterprise Administration Server 中新增一個新的 MIME 類型(Category: type,Content-Type: magnus-internal/x-httpd-php,File Suffix: php)。

  • 編輯 magnus.conf(伺服器版本 >= 6)或 obj.conf(伺服器版本 < 6)並加入下面兩行;要將新行放在 mime types init 之後:
    Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll"
    Init fn="php4_init" LateInit="yes" errorString="Failed to initialise PHP!" [php_ini="c:/path/to/php.ini"]
    (PHP >= 4.3.3)php_ini 參數為可選項,但加上後就可以把 php.ini 放到 web 伺服器的配置目錄中去。

  • obj.conf 中配置預設物件(對於虛擬伺服器類 [Sun web Server 6.0+] 是 vserver.obj.conf 檔案):在 <Object name="default"> 一節,在所有的「ObjectType」行之後和所有的「AddLog」行之前加上這一行:
    Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...]
    (PHP >= 4.3.3)作為附加參數可以加入一些特殊的 php.ini 值,例如可以在呼叫 php4_execute 時設定專門的 docroot="/path/to/docroot"。對於布爾的 ini 選項請用 0/1 作為值,而不是 "On","Off",...(這樣不能正確工作),例如要用 zlib.output_compression=1 而不是 zlib.output_compression="On"

  • 這幾行僅在想要配置一個只有 PHP 腳本的目錄時需要(類似 cgi-bin 目錄):
    <Object name="x-httpd-php">
    ObjectType fn="force-type" type="magnus-internal/x-httpd-php"
    Service fn=php4_execute [inikey=value inikey=value ...]
    </Object>
    在此之後可以在管理伺服器中配置目錄並將其類型設為 x-httpd-php。其中的所有檔案都將作為 PHP 執行。這樣可以隱藏 PHP 的使用,檔案名還保留為 .html

  • 重啟動 web 服務使改動生效。

  • 對每個要運行 PHP 的 web 伺服器案例都進行以上步驟。

注: 更多將 PHP 設定為 NSAPI內容見:http://benoit.noss.free.fr/php/install-php4.html

注: PHP 使用的堆疊大小(stacksize)依賴於 web 伺服器的配置。若果在運行很大的 PHP 腳本時死掉,建議在管理伺服器中增大此值(在 "MAGNUS EDITOR" 一節中)。

CGI 環境以及推薦在 php.ini 中進行的修改

在寫 PHP 腳本時很重要一點是 Sun JSWS/Sun ONE WS/iPlanet/Netscape 是多執行緒 web 伺服器。因此所有的請求都運行於同一個程式空間(即 web 伺服器自己的空間)而此空間只有一個環境。若果想取得 CGI 變量例如 PATH_INFOHTTP_HOST 等時不能用老的 PHP 3.x 的模式 getenv() 或是類似手段($_ENV)進行。只能取得運行的 web 伺服器的環境變量而沒有任何有效的 CGI 變量!

注: 為什麼環境中有一些(無效的)CGI 變量?

解答:這是因為從管理伺服器啟動了 web 伺服器程式,這將運行 web 伺服器的啟動腳本,而你想要啟動的是 CGI 腳本(CGI 腳本在管理伺服器內定!)。這是為什麼 web 伺服器啟動的環境中有一些 CGI 環境變量的原因。可以不從管理伺服器啟動 web 伺服器來試驗一下。用管理員會員從指令行手動啟動--這樣就不會看到類似 CGI 的環境變量了。

PHP 4.x 中取得 CGI 變量的正確模式是使用超全局變量 $_SERVER。若果有一些老的腳本用了 $HTTP_HOST 等,那應該在 php.ini 中開啟 register_globals 選項並改變變量順序(重要提示:去掉 "E",因為這裡不需要環境變量):
variables_order = "GPCS"
register_globals = On

錯誤頁面的特殊使用或定制目錄清單(PHP >= 4.3.3)

可以用 PHP 來為 "404 Not Found" 或類似的錯誤提示建立錯誤頁面。對每個想要覆蓋的錯誤頁面在 obj.conf 中的對象裡加入下面這行:
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
其中的 XXX 是 HTTP 錯誤代碼。移除掉可能干擾到自己設定的任何其它 Error 指令。若果對所有可能出現的錯誤都用同一個腳本處理,不要 code 參數即可。腳本裡可以用 $_SERVER['ERROR_TYPE'] 取得 HTTP 狀態代碼。

還可以建立自己定制的目錄清單。只要建立一個顯示目錄清單的 PHP 腳本並用下面一行在 obj.conf 中置換掉相應 type="magnus-internal/directory" 預設的 Service 設定:
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
對於錯誤和目錄清單頁面,原始的 URI 和轉換後的 URI 都在變量 $_SERVER['PATH_INFO']$_SERVER['PATH_TRANSLATED'] 中。

有關 nsapi_virtual() 和子請求(PHP >= 4.3.3)的說明

NSAPI 模組現在支援 nsapi_virtual() 函數(別名:virtual())來進行子請求並將結果插入到 web 頁面裡。問題是,此函數用到了一些 NSAPI 庫中沒有文件說明的特性。

在 Unix 下這不是問題,因為模組會自動尋找所需的函數並使用。若果找不到,nsapi_virtual() 被禁用。

在 Windows 下 DLL 處理的局限性需要使用最新的 ns-httpdXX.dll 檔案中的自動檢驗功能。這已在版本 6.1 及以下的伺服器中測試過。若果用了更高版本的 Sun 伺服器,檢驗會失敗並禁用 nsapi_virtual()

在這種情況下,試試下面的方法。在 magnus.conf/obj.conf 中的 php4_init 裡加入下面的參數:
Init fn=php4_init ... server_lib="ns-httpdXX.dll"
其中 XX 是正確的 DLL 版本號。在 server-root 目錄下去找合適的 DLL 的名字。檔案大小最大的 DLL 就是了。

可以用 phpinfo() 函數來檢查狀態。

注: 但要注意:對 nsapi_virtual() 的支援是試驗性質的!