安裝常見問題

本章包括了安裝 PHP 的常見問題。PHP 可以用于幾乎任何操作系統(tǒng)(可能除了 OS X 之前的 MacOS 之外),以及幾乎任何 web 服務器。

要安裝 PHP,請按照 安裝與配置一章中的指示進行。

  1. 為什么不應該在實際運作環(huán)境中的 Apache2 中使用線程化的 MPM?
  2. Unix/Windows:應該上哪兒去找我的 php.ini 文件?
  3. Unix:我安裝了 PHP,但每次我打開一個頁面時,只得到一條“Document Contains No Data”消息!這是怎么回事?
  4. Unix:我從 RPMS 安裝了 PHP,但是 Apache 不處理 PHP 頁面!這是怎么回事?
  5. Unix:我給 Apache 加上了 FrontPage extensions 補丁,結(jié)果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 兼容嗎?
  6. Unix/Windows:我已經(jīng)安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 腳本時,得到了一個空白頁面。
  7. Unix/Windows:我已經(jīng)安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 腳本時,得到了一個服務器的 500 錯誤。
  8. 某些操作系統(tǒng):我已經(jīng)在不出錯的情況下安裝了 PHP,但當我試著啟動 Apache 時得到了一個未定義符號錯誤: [mybox:user /src/php4] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd Undefined symbols: _compress _uncompress
  9. Windows:我已經(jīng)安裝了 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:我已經(jīng)照著所有的說明做了,但還是不能讓 PHP 和 IIS 一起工作!
  11. 當在 IIS,PWS,OmniHTTPD 或者 Xitami 中以 CGI 方式運行 PHP 時,出現(xiàn)如下錯誤: Security Alert! PHP CGI cannot be accessed directly..
  12. 怎樣得知我的 php.ini 是否被找到和應用了?似乎我做的修改都沒有生效。
  13. 怎樣將 PHP 目錄加入到 Windows 路徑 PATH中去?
  14. 怎樣使 php.ini 文件在 Windows 下被 PHP 所用?
  15. 有可能使 PHP 運作于 Apache 的 content negotiation(MultiViews 選項)嗎?
  16. PHP 是否僅限于處理 GET 和 POST 請求方法?
為什么不應該在實際運作環(huán)境中的 Apache2 中使用線程化的 MPM?

PHP 是粘合劑。它將幾十種第三方的庫粘合到一起來創(chuàng)建很酷的 web 應用,并通過很直觀且易于學習的語言界面使其看上去好像一個整體。PHP 的靈活與強大依賴于底層平臺的穩(wěn)定與耐用。起碼需要將一個可運作的操作系統(tǒng),一個可運作的 web 服務器以及可運作的第三方庫粘合起來。其中任何一方不運作了,PHP 都需要有方法來識別出問題并且快速解決。如果沒有完全獨立的執(zhí)行線程,完全獨立的內(nèi)存單元和穩(wěn)定的空間對付每個請求,那底層架構就太復雜以至于不穩(wěn)定因素更容易進入到 PHP 系統(tǒng)中。

如果必須要用線程化的 MPM,看看 FastCGI 配置,使 PHP 運行于自己獨立的內(nèi)存空間中。

最后需要指出,不使用線程化 MPM 的警告在 Windows 系統(tǒng)中沒那么強烈,因為 Windows 中的大多數(shù)庫都理應在多線程下安全運行。

Unix/Windows:應該上哪兒去找我的 php.ini 文件?

UNIX 中默認在 /usr/local/lib目錄中,也就是 <install-path>/lib。很多人會在編譯時通過 --with-config-file-path標記來改變路徑。例如可以將路徑設為:

--with-config-file-path=/etc
然后從發(fā)行包中將 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 文件。

參見 配置文件。

Unix:我安裝了 PHP,但每次我打開一個頁面時,只得到一條“Document Contains No Data”消息!這是怎么回事?

這可能意味著 PHP 發(fā)生了某類錯誤而導致了 core dump。查看服務器的錯誤日志看看是不是這樣,再用一個小的測試例子試著重現(xiàn)此問題。如果你會用“gdb”的話,那么在 bug 報告中提供回溯跟蹤很有助于幫開發(fā)人員查明問題。如果你用 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 報告中包括回溯追蹤記錄。應該提交到 ? https://github.com/php/php-src/issues

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

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

假定你的 Apache 和 PHP 都是從 RPM 包中安裝的,你需要在 httpd.conf 文件中取消以下部分或所有行的注釋,或者把它們添加到該文件中:

# Extra Modules
AddModule mod_php.c
AddModule mod_perl.c

# Extra Modules
LoadModule php_module         modules/mod_php.so
LoadModule php5_module        modules/libphp5.so
LoadModule perl_module        modules/libperl.so
并且把:
AddType application/x-httpd-php .php
添加到全局屬性中,或者添加到你希望加入 PHP 支持的虛擬域中。

Unix:我給 Apache 加上了 FrontPage extensions 補丁,結(jié)果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 兼容嗎?

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

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

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

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

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

某些操作系統(tǒng):我已經(jīng)在不出錯的情況下安裝了 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 中。

Windows:我已經(jīng)安裝了 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 根本就不能產(chǎn)生任何輸出。要想看到有意義的錯誤信息,在命令行中轉(zhuǎn)到 PHP 可執(zhí)行程序(Windows 中是 php.exe)所在目錄下并運行 php -i。如果 PHP 運行有任何問題,那么會顯示相應的錯誤信息,這將給你下一步要做什么的線索。如果你得到滿屏幕 HTML 代碼( phpinfo()函數(shù)的輸出)的話說明 PHP 本身工作正常。

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

  • 文件權限問題,你的 PHP 腳本, php.exe, php4ts.dllphp.ini 或任何你要加載的 PHP 擴展庫是匿名 internet 用戶 ISUR_<machinename>無權訪問的。
  • 腳本文件不存在(或者有可能不在你以為的地方,注意 web 文檔的目錄)。注意在 IIS 中通過 Internet 服務管理器設定腳本映射時選中“檢查文件是否存在”可以捕捉到此錯誤。這樣一來如果腳本文件不存在的話服務器就會返回一個 404 錯誤信息。還有一個額外的好處就是 IIS 會基于 NTLanMan 權限來替你對腳本文件做任何所需要的認證。
Windows:我已經(jīng)照著所有的說明做了,但還是不能讓 PHP 和 IIS 一起工作!

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

當在 IIS,PWS,OmniHTTPD 或者 Xitami 中以 CGI 方式運行 PHP 時,出現(xiàn)如下錯誤: Security Alert! PHP CGI cannot be accessed directly..

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

因為默認值是 1,因此你必須百分之百確認使用了正確的 php.ini 文件。詳細信息請閱讀 此常見問題。

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

要確認你的 php.ini 被 PHP 使用了,調(diào)用 phpinfo(),在接近開頭的位置有一項叫做 Configuration File (php.ini)。這里將告訴你 PHP 在哪里找到了 php.ini 并且是否使用了。如果只顯示一個目錄則 沒有使用任何 php.ini 文件,你應將你的 php.ini 文件放到該目錄中。如果 php.ini 包括在該路徑中則它已被應用了。

如果 php.ini 被使用了并且你是以模塊方式運行 PHP 的,確保在修改了 php.ini 之后重新啟動你的 web server。

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

在 Windows NT,2000,XP 和 2003 下:

  • 進入控制面板并打開“系統(tǒng)”圖標(開始 -> 設置 -> 控制面板 -> 系統(tǒng),Windows XP/2003 中是:開始 -> 控制面板 -> 系統(tǒng))

  • 選擇“高級”標簽頁

  • 點擊“環(huán)境變量”按鈕

  • 在“系統(tǒng)變量”欄中

  • 找到 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 系統(tǒng)目錄中去,這是因為該目錄( C:\Windows, C:\WINNT,等等)默認就在系統(tǒng)路徑中。但是把文件拷貝到 Windows 系統(tǒng)目錄中這一方式早已不被提倡,還可能造成問題。

怎樣使 php.ini 文件在 Windows 下被 PHP 所用?

有幾種方法可以做到這一點。如果您使用的是 Apache, 請參閱 Apache 文檔,否則 您必須設置PHPRC環(huán)境變量。

有可能使 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。

PHP 是否僅限于處理 GET 和 POST 請求方法?

不是,PHP 有可能處理任何請求方法,例如 CONNECT。適當?shù)幕貞獱顟B(tài)可以用 header()發(fā)送。如果僅需要處理 GET 和 POST 方法,可以通過如下的 Apache 配置實現(xiàn):

<LimitExcept GET POST>
Deny from all
</LimitExcept>