章 52. 安裝常見問題

本章內含了安裝 PHP 的常見問題。PHP 可以用於幾乎任何動作系統(可能除了 OS X 之前的 MacOS 之外),以及幾乎任何 web 伺服器。

要安裝 PHP,請按照發行包中 INSTALL 檔案的說明進行。Windows 會員同樣還要閱讀 install.txt 檔案。對於 Windows 會員還有一些有用的提示在 Windows 系統下的安裝一章。

1. 為什麼不應該在實際運作環境中的 Apache2 中使用執行緒化的 MPM?
2. Unix/Windows:應該上哪兒去找我的 php.ini 檔案?
3. Unix:我安裝了 PHP,但每次我開啟一個頁面時,只得到一條「Document Contains No Data」訊息!這是怎麼回事?
4. Unix:我從 RPMS 安裝了 PHP,但是 Apache 不處理 PHP 頁面!這是怎麼回事?
5. Unix:我從 RPMS 安裝了 PHP 3,但它沒有把我需要的資料庫支援編譯進去!這是怎麼回事?
6. Unix:我給 Apache 加上了 FrontPage extensions 修改更新,結果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 相容嗎?
7. Unix/Windows:我已經安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 腳本時,得到了一個空白頁面。
8. Unix/Windows:我已經安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 腳本時,得到了一個伺服器的 500 錯誤。
9. 某些動作系統:我已經在不出錯的情況下安裝了 PHP,但當我試著啟動 Apache 時得到了一個未定義符號錯誤:
[mybox:user /src/php4] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress
10. Windows:我已經安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 腳本時,得到如下錯誤:
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:
11. Windows:我已經照著所有的說明做了,但還是不能讓 PHP 和 IIS 一起工作!
12. 當在 IIS,PWS,OmniHTTPD 或是 Xitami 中以 CGI 模式運行 PHP 時,出現如下錯誤:Security Alert! PHP CGI cannot be accessed directly..
13. 怎樣得知我的 php.ini 是否被找到和套用了?似乎我做的修改都沒有生效。
14. 怎樣將 PHP 目錄加入到 Windows 路徑 PATH 中去?
15. 怎樣使 php.ini 檔案在 Windows 下被 PHP 所用?
16. 有可能使 PHP 運作於 Apache 的 content negotiation(MultiViews 選項)嗎?
17. PHP 是否僅限於處理 GET 和 POST 請求方法?

1. 為什麼不應該在實際運作環境中的 Apache2 中使用執行緒化的 MPM?

PHP 是粘合劑。它將幾十種第三方的庫粘合到一起來建立很酷的 web 套用,並通過很直觀且易於學習的語系介面使其看上去好像一個整體。PHP 的靈活與強大依賴於底層平台的穩定與耐用。起碼需要將一個可運作的動作系統,一個可運作的 web 伺服器以及可運作的第三方庫粘合起來。其中任何一方不運作了,PHP 都需要有方法來識別出問題並且快速解決。若果沒有完全獨立的執行執行緒,完全獨立的記憶體單元和穩定的空間對付每個請求,那底層架構就太複雜以至於不穩定因素更容易進入到 PHP 系統中。

若果必須要用執行緒化的 MPM,看看 FastCGI 配置,使 PHP 運行於自己獨立的記憶體空間中。

最後需要指出,不使用執行緒化 MPM 的警示在 Windows 系統中沒那麼強烈,因為 Windows 中的大多數庫都理應在多執行緒下安全運行。

2. Unix/Windows:應該上哪兒去找我的 php.ini 檔案?

UNIX 中預設在 /usr/local/lib 目錄中,也就是 <install-path>/lib。很多人會在編譯時通過 --with-config-file-path 旗標來改變路徑。例如可以將路徑設為:
--with-config-file-path=/etc
然後從發行包中將 php.ini-dist 複製為 /etc/php.ini 並編輯它來作出想要的修改。

--with-config-file-scan-dir=PATH

Windows 中 php.ini 檔案的預設路徑在 Windows 目錄下。若果使用的是 Apache 伺服器,則會首先在 Apache 的安裝目錄中尋找 php.ini,例如 C:\Program Files\Apache Group\Apache。這樣同一台機器上不同版本的 Apache 就可以有不同的 php.ini 檔案。

參見配置檔

3. Unix:我安裝了 PHP,但每次我開啟一個頁面時,只得到一條「Document Contains No Data」訊息!這是怎麼回事?

這可能意味著 PHP 發生了某類錯誤而導致了 core dump。檢視伺服器的錯誤日誌看看是不是這樣,再用一個小的測試例子試著重現此問題。若果你會用「gdb」的話,那麼在 bug 報告中提供回溯追蹤很有助於幫開發人員查明問題。若果你用 Apache 的模組模式使用 PHP,試著這麼做:

  • 停止 httpd 程式

  • gdb httpd

  • 停止 httpd 程式

  • > run -X -f /path/to/httpd.conf

  • 然後在你的瀏覽器中訪問導致錯誤的 URL

  • > run -X -f /path/to/httpd.conf

  • 若果你遇到 core dump,gdb 此時就會知會你

  • 輸入:bt

  • 你應該在 bug 報告中內含回溯追蹤記錄。應該送出到 http://bugs.php.net/

若果你的腳本使用了正則表達式函數(ereg() 等),應該確認在編譯 PHP 和 Apache 時使用了同一個正則表達式包。在 PHP 和 Apache 1.3.x 中應該自動就是這樣。

4. Unix:我從 RPMS 安裝了 PHP,但是 Apache 不處理 PHP 頁面!這是怎麼回事?

假定你的 Apache 和 PHP 都是從 RPM 包中安裝的,你需要在 httpd.conf 檔案中取消以下部分或所有行的注解,或是把它們新增到該檔案中:
# Extra Modules
AddModule mod_php.c
AddModule mod_php3.c
AddModule mod_perl.c

# Extra Modules
LoadModule php_module         modules/mod_php.so
LoadModule php3_module        modules/libphp3.so     # for PHP 3
LoadModule php4_module        modules/libphp4.so     # for PHP 4
LoadModule perl_module        modules/libperl.so
並且把:
AddType application/x-httpd-php3 .php3    # for PHP 3
AddType application/x-httpd-php .php      # for PHP 4
新增到全局屬性中,或是新增到你希望加入 PHP 支援的虛擬功能變數中。

5. Unix:我從 RPMS 安裝了 PHP 3,但它沒有把我需要的資料庫支援編譯進去!這是怎麼回事?

由於 PHP 3 構造的原因,不容易編譯出一個完全靈活的 PHP RPM 包來。這個問題在 PHP 4 中解決了。對於 PHP 3 來說,我們目前建議你用 PHP 發行包中 INSTALL.REDHAT 檔案中所描述的機制。若果你堅持要用 PHP 3 的 RPM 版本,請接著往下看。

為了簡化安裝以及由於 RPMS 使用了 /usr/ 而不是標準的 /usr/local/ 目錄來存放檔案,製作 RPM 包的人設定 RPMS 不安裝任何資料庫支援。你需要告訴 RPM 說明檔案,你想要支援哪個資料庫以及你的資料庫伺服器最高層路徑。

下面的例子解說了如何在用模組安裝下的 Apache 中加入流行的 MySQL 資料庫伺服器支援的過程。

當然這些訊息可以調整用於任何 PHP 支援的資料庫伺服器。本例中我們也假定你從 RPMS 中完整安裝了 MySQL 和 Apache。

  • 先去掉 mod_php3:
    rpm -e mod_php3

  • 然後取得源檔案的 rpm 包並安裝它,而不是編譯它。
    rpm -Uvh mod_php3-3.0.5-2.src.rpm

  • 接著編輯 /usr/src/redhat/SPECS/mod_php3.spec 檔案

    在 %build 一節加入你想要的資料庫支援,以及路徑。

    對應於 MySQL 你應該加入 --with-mysql=/usr。則 %build 一節看上去將類似這樣:
    ./configure --prefix=/usr \
    --with-apxs=/usr/sbin/apxs \
    --with-config-file-path=/usr/lib \
    --enable-debug=no \
    --enable-safe-mode \
    --with-exec-dir=/usr/bin \
    --with-mysql=/usr \
    --with-system-regex

  • 一旦完成了這個修改,就這樣建立二進位程式的 rpm 包:
    rpm -bb /usr/src/redhat/SPECS/mod_php3.spec

  • 然後安裝 rpm
    rpm -ivh /usr/src/redhat/RPMS/i386/mod_php3-3.0.5-2.i386.rpm

確認重新啟動了 Apache,這下你就有了用 RPM 安裝的並且帶 MySQL 支援的 PHP 3 了。注意按照 PHP 3 發行包中 INSTALL.REDHAT 檔案的說明來編譯其實也許更容易一些。

6. Unix:我給 Apache 加上了 FrontPage extensions 修改更新,結果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 相容嗎?

相容的。PHP 可以和 FrontPage extensions 一起工作,問題是 FrontPage 修改更新修改了幾個 PHP 依賴的 Apache 構造。在 FrontPage 修改更新安裝之後之後重新編譯 PHP(用「make clean ; make」)可以解決此問題。

7. Unix/Windows:我已經安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 腳本時,得到了一個空白頁面。

用瀏覽器中的「檢視源檔案」,你可能會發現能看到 PHP 腳本的源程式。這意味著 web 伺服器沒有把腳本傳送給 PHP 解釋。伺服器配置在某處有問題,請對照 PHP 安裝說明仔細檢查伺服器配置。

8. Unix/Windows:我已經安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 腳本時,得到了一個伺服器的 500 錯誤。

當伺服器嘗試運行 PHP 時出了錯。要想看到有意義的錯誤訊息,在指令行中轉到 PHP 可執行程式(Windows 中是 php.exe)所在目錄下並運行 php -i。若果 PHP 運行有任何問題,那麼會顯示相應的錯誤訊息,這將給你下一步要做什麼的線索。若果你得到滿螢幕 HTML 代碼(phpinfo() 函數的輸出)的話說明 PHP 本身工作標準,你的問題可能和你的伺服器配置有關,要仔細檢查。

9. 某些動作系統:我已經在不出錯的情況下安裝了 PHP,但當我試著啟動 Apache 時得到了一個未定義符號錯誤:
[mybox:user /src/php4] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress

這實際上和 PHP 沒有關係,而和 MySQL 的用戶端庫有關。有的需要 --with-zlib,有的不需要。這個問題也內含在 MySQL 的 FAQ 中。

10. Windows:我已經安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 腳本時,得到如下錯誤:
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:

這個錯誤訊息意味著 PHP 根本就不能產生任何輸出。要想看到有意義的錯誤訊息,在指令行中轉到 PHP 可執行程式(Windows 中是 php.exe)所在目錄下並運行 php -i。若果 PHP 運行有任何問題,那麼會顯示相應的錯誤訊息,這將給你下一步要做什麼的線索。若果你得到滿螢幕 HTML 代碼(phpinfo() 函數的輸出)的話說明 PHP 本身工作標準。

一旦 PHP 在指令行中工作標準,試著通過瀏覽器再次訪問腳本。若果還失敗的話那可能是如下原因之一:

  • 檔案權限問題,你的 PHP 腳本,php.exephp4ts.dllphp.ini 或任何你要加載的 PHP 增加庫是匿名 internet 會員 ISUR_<machinename> 無權訪問的。

  • 腳本檔案不存在(或是有可能不在你以為的地方,注意 web 文件的目錄)。注意在 IIS 中通過 Internet 服務管理器設定腳本映射時選中「檢查檔案是否存在」可以捕捉到此錯誤。這樣一來若果腳本檔案不存在的話伺服器就會返回一個 404 錯誤訊息。還有一個額外的好處就是 IIS 會基於 NTLanMan 權限來替你對腳本檔案做任何所需要的認證。

11. Windows:我已經照著所有的說明做了,但還是不能讓 PHP 和 IIS 一起工作!

確認需要運行 PHP 腳本的任何會員有權限運行 php.exe!IIS 使用了一個在安裝 IIS 時增加的匿名會員,這個會員需要有訪問 php.exe 的權限。同樣任何認證會員也需要執行 php.exe 的權限。在 IIS4 中你還需要告訴它 PHP 是一個腳本引擎。此外,你可能還需要閱讀此常見問題

12. 當在 IIS,PWS,OmniHTTPD 或是 Xitami 中以 CGI 模式運行 PHP 時,出現如下錯誤:Security Alert! PHP CGI cannot be accessed directly..

必須將 cgi.force_redirect 選項設為 0。 預設值為 1,因此要確認此選項沒有被注解掉(用 ;)。和其它選項一樣,是在 php.ini 中設定的。

因為預設值是 1,因此你必須百分之百確認使用了正確的 php.ini 檔案。詳細訊息請閱讀此常見問題

13. 怎樣得知我的 php.ini 是否被找到和套用了?似乎我做的修改都沒有生效。

要確認你的 php.ini 被 PHP 使用了,呼叫 phpinfo(),在接近開頭的位置有一項叫做 Configuration File (php.ini)。這裡將告訴你 PHP 在哪裡找到了 php.ini 並且是否使用了。若果只顯示一個目錄則 沒有使用任何 php.ini 檔案,你應將你的 php.ini 檔案放到該目錄中。若果 php.ini 內含在該路徑中則它已被套用了。

若果 php.ini 被使用了並且你是以模組模式運行 PHP 的,確保在修改了 php.ini 之後重新啟動你的 web server。

14. 怎樣將 PHP 目錄加入到 Windows 路徑 PATH 中去?

在 Windows NT,2000,XP 和 2003 下:

  • 進入控制台並開啟「系統」圖示(開始 -> 設定 -> 控制台 -> 系統,Windows XP/2003 中是:開始 -> 控制台 -> 系統)

  • 選取「進階」標籤頁

  • 點閱「環境變量」按鈕

  • 在「系統變量」欄中

  • 找到 Path 這一項(可能需要向下卷動才能找到)

  • 滑鼠按兩下 Path 這一項

  • 在最後加入你的 PHP 目錄,內含前面的「;」(例如:;C:\php

  • 點閱「確定」並重新啟動電腦

在 Windows 98/Me 中需要編輯 autoexec.bat 檔案:

  • 開啟記事本(開始 -> 運行,然後輸入 notepad 並點確定)

  • 開啟 C:\autoexec.bat 檔案

  • 找到這麼一行:PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;..... 並在最後加上 ;C:\php

  • 儲存檔案並重新啟動電腦

注: 記住在上述修改之後重新啟動,以確保對 PATH 的改變生效。

PHP 手冊過去提倡把檔案複製到 Windows 系統目錄中去,這是因為該目錄(C:\WindowsC:\WINNT,等等)預設就在系統路徑中。但是把檔案複製到 Windows 系統目錄中這一模式早已不被提倡,還可能造成問題。

15. 怎樣使 php.ini 檔案在 Windows 下被 PHP 所用?

有幾種方法。若果使用 Apache,閱讀專門的安裝指示(Apache 1Apache 2),否則就必須設定 PHPRC 環境變量:

在 Windows NT,2000,XP 和 2003 種:

  • 進入控制台並開啟「系統」圖示(開始 -> 設定 -> 控制台 -> 系統,Windows XP/2003 中是:開始 -> 控制台 -> 系統)

  • 選取「進階」標籤頁

  • 點閱「環境變量」按鈕

  • 在「系統變量」欄中

  • 點閱「新增」按鈕並在「變量名」中輸入「PHPRC」,在「變量值」中輸入 php.ini 檔案所在的目錄(例如:C:\php

  • 點閱「確定」並重新啟動電腦

在 Windows 98/Me 中需要編輯 autoexec.bat 檔案:

  • 開啟記事本(開始 -> 運行,然後輸入 notepad 並點確定)

  • 開啟 C:\autoexec.bat 檔案

  • 在檔案結尾處加入一行:set PHPRC=C:\php(將 C:\php 置換為你的 php.ini 實際存在的目錄)。注意路徑中不能包括空格。例如將 PHP 安裝到了 C:\Program Files\PHP 中,你需要輸入 C:\PROGRA~1\PHP 替代之

  • 儲存檔案並重新啟動電腦

16. 有可能使 PHP 運作於 Apache 的 content negotiation(MultiViews 選項)嗎?

若果到 PHP 檔案的連線包括副檔名,一切都運行完美。本解答只針對到 PHP 檔案的連線不包括副檔名時,而希望通過 content negotiation 來永遠不包括副檔名的 URL 來選取 PHP 檔案的情況。在此種情況下,將 AddType application/x-httpd-php .php 置換為:
# PHP 4
AddHandler php-script php
AddType text/html php

# PHP 5
AddHandler php5-script php
AddType text/html php
此專案對於 Apache 1 不適用,因為 PHP 模組不捕捉 php-script

17. PHP 是否僅限於處理 GET 和 POST 請求方法?

不是,PHP 有可能處理任何請求方法,例如 CONNECT。適當的回應狀態可以用 header() 傳送。若果僅需要處理 GET 和 POST 方法,可以通過如下的 Apache 配置實現:
<LimitExcept GET POST>
Deny from all
</LimitExcept>