安裝常見問題

安裝常見問題

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

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

  1. 為什麼不應該在實際運作環境中的 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 補丁,結果 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 一起工作!
  11. 當在 IIS,PWS,OmniHTTPD 或者 Xitami 中以 CGI 方式執行 PHP 時,出現如下錯誤: 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 請求方法?
為什麼不應該在實際運作環境中的 Apache2 中使用執行緒化的 MPM?

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

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

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

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 檔案。

參見 配置檔案

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 報告中包括回溯追蹤記錄。應該提交到 » https://github.com/php/php-src/issues

如果你的指令碼使用了正規表示式函式( 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 補丁,結果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 相容嗎?

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

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

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

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

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

某些操作系統:我已經在不出錯的情況下安裝了 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:我已經安裝了 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 許可權來替你對指令碼檔案做任何所需要的認證。
Windows:我已經照著所有的說明做了,但還是不能讓 PHP 和 IIS 一起工作!

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

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

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

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

怎樣得知我的 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。

怎樣將 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 系統目錄中這一方式早已不被提倡,還可能造成問題。

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

有幾種方法可以做到這一點。如果您使用的是 Apache, 請參閱 Apache 文件,否則 您必須設定PHPRC環境變數。

有可能使 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。適當的迴應狀態可以用 header()發送。如果僅需要處理 GET 和 POST 方法,可以通過如下的 Apache 配置實現:

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *