本節包括針對在 Windows 下 Sun Java System web 伺服器,Sun ONE
web 伺服器,iPlanet 和 Netscape 伺服器的 PHP 安裝說明與提示。
自 PHP 4.3.3 起可以通過
NSAPI 模組使用 PHP 腳本來產生定制目錄清單於錯誤頁面。也可以使用為相容
Apache 的附加函數。目前使用的 web 伺服器的支援請閱讀有關子請求的說明。
要將 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。
要將 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 使用的堆疊大小(stacksize)依賴於 web 伺服器的配置。若果在運行很大的
PHP 腳本時死掉,建議在管理伺服器中增大此值(在 "MAGNUS EDITOR" 一節中)。
在寫 PHP 腳本時很重要一點是 Sun JSWS/Sun ONE
WS/iPlanet/Netscape 是多執行緒 web
伺服器。因此所有的請求都運行於同一個程式空間(即
web 伺服器自己的空間)而此空間只有一個環境。若果想取得 CGI
變量例如 PATH_INFO,HTTP_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 來為 "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 模組現在支援 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() 函數來檢查狀態。