章 48. 安裝

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

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

1. Unix/Windows:應該上哪兒去找我的 php.ini 文件?
2. Unix:我安裝了 PHP,但每次我打開一個頁面時,只得到一條“Document Contains No Data”消息!這是怎麼回事?
3. Unix:我從 RPMS 安裝了 PHP,但是 Apache 不處理 PHP 頁面!這是怎麼回事?
4. Unix:我從 RPMS 安裝了 PHP 3,但它沒有把我需要的資料庫支援編譯進去!這是怎麼回事?
5. Unix:我給 Apache 加上了 FrontPage extensions 補丁,結果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 相容嗎?
6. Unix/Windows:我已經安裝了 PHP,但當我試著通過瀏覽器連接 PHP 腳本時,得到了一個空白頁面。
7. Unix/Windows:我已經安裝了 PHP,但當我試著通過瀏覽器連接 PHP 腳本時,得到了一個伺服器的 500 錯誤。
8. 某些操作系統:我已經在不出錯的情況下安裝了 PHP,但當我試著啟動 Apache 時得到了一個未定義符號錯誤:
[mybox:user /src/php4] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress
9. 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:
10. Windows:我已經照著所有的說明做了,但還是不能讓 PHP 和 IIS 一起工作!

1. 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 並編輯它來作出你想要的修改。

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

參見配置文件

2. 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 中應該自動就是這樣。

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

假定你的 Apache 和 PHP 都是從 RPM 包中安裝的,你需要在 http.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 支援的虛擬域中。

4. 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 文件的說明來編譯其實也許更容易一些。

5. Unix:我給 Apache 加上了 FrontPage extensions 補丁,結果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 相容嗎?

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

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

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

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

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

8. 某些操作系統:我已經在不出錯的情況下安裝了 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 中。

9. 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 權限來替你對腳本文件做任何所需要的認証。

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

確認需要執行 PHP 腳本的任何用戶有權限執行 php.exe!IIS 使用了一個在安裝 IIS 時增加的匿名用戶,這個用戶需要有連接 php.exe 的權限。同樣任何認証用戶也需要執行 php.exe 的權限。在 IIS4 中你還需要告訴它 PHP 是一個腳本引擎。