安裝常見問題
本章包括了安裝 PHP 的常見問題。PHP 可以用於幾乎任何操作系統(可能除了 OS X 之前的 MacOS 之外),以及幾乎任何 web 伺服器。
要安裝 PHP,請按照 安裝與配置一章中的指示進行。
- 為什麼不應該在實際運作環境中的 Apache2 中使用執行緒化的 MPM?
- Unix/Windows:應該上哪兒去找我的 php.ini 檔案?
- Unix:我安裝了 PHP,但每次我打開一個頁面時,只得到一條“Document Contains No Data”訊息!這是怎麼回事?
- Unix:我從 RPMS 安裝了 PHP,但是 Apache 不處理 PHP 頁面!這是怎麼回事?
- Unix:我給 Apache 加上了 FrontPage extensions 補丁,結果 PHP 突然不工作了。PHP 和 Apache FrontPage extensions 相容嗎?
- Unix/Windows:我已經安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 指令碼時,得到了一個空白頁面。
- Unix/Windows:我已經安裝了 PHP,但當我試著通過瀏覽器訪問 PHP 指令碼時,得到了一個伺服器的 500 錯誤。
- 某些操作系統:我已經在不出錯的情況下安裝了 PHP,但當我試著啟動 Apache 時得到了一個未定義符號錯誤: [mybox:user /src/php4] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd Undefined symbols: _compress _uncompress
- 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:
- Windows:我已經照著所有的說明做了,但還是不能讓 PHP 和 IIS 一起工作!
- 當在 IIS,PWS,OmniHTTPD 或者 Xitami 中以 CGI 方式執行 PHP 時,出現如下錯誤: Security Alert! PHP CGI cannot be accessed directly..
- 怎樣得知我的 php.ini 是否被找到和應用了?似乎我做的修改都沒有生效。
- 怎樣將 PHP 目錄加入到 Windows 路徑 PATH中去?
- 怎樣使 php.ini 檔案在 Windows 下被 PHP 所用?
- 有可能使 PHP 運作于 Apache 的 content negotiation(MultiViews 選項)嗎?
- 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標記來改變路徑。例如可以將路徑設為:
然後從發行包中將 php.ini-dist拷貝為 /etc/php.ini並編輯它來作出想要的修改。--with-config-file-path=/etc
--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
- 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.exe,
php4ts.dll,php.ini 或任何你要載入的 PHP 擴充套件庫是匿名 internet 使用者
ISUR_<machinename>
無權訪問的。 - 指令碼檔案不存在(或者有可能不在你以為的地方,注意 web 文件的目錄)。注意在 IIS 中通過 Internet 服務管理器設定指令碼對映時選中「檢查檔案是否存在」可以捕捉到此錯誤。這樣一來如果指令碼檔案不存在的話伺服器就會返回一個 404 錯誤資訊。還有一個額外的好處就是 IIS 會基於 NTLanMan 許可權來替你對指令碼檔案做任何所需要的認證。
-
檔案許可權問題,你的 PHP 指令碼,
php.exe,
php4ts.dll,php.ini 或任何你要載入的 PHP 擴充套件庫是匿名 internet 使用者
- 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:\Windows, C:\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
php-script
。
- PHP 是否僅限於處理 GET 和 POST 請求方法?
-
不是,PHP 有可能處理任何請求方法,例如 CONNECT。適當的迴應狀態可以用 header()發送。如果僅需要處理 GET 和 POST 方法,可以通過如下的 Apache 配置實現:
<LimitExcept GET POST> Deny from all </LimitExcept>