本章包括了安裝 PHP 的常見問題。PHP 可以用于幾乎任何操作系統(tǒng)(可能除了 OS X 之前的 MacOS 之外),以及幾乎任何 web 服務(wù)器。
要安裝 PHP,請按照 安裝與配置一章中的指示進(jìn)行。
PHP 是粘合劑。它將幾十種第三方的庫粘合到一起來創(chuàng)建很酷的 web 應(yīng)用,并通過很直觀且易于學(xué)習(xí)的語言界面使其看上去好像一個整體。PHP 的靈活與強大依賴于底層平臺的穩(wěn)定與耐用。起碼需要將一個可運作的操作系統(tǒng),一個可運作的 web 服務(wù)器以及可運作的第三方庫粘合起來。其中任何一方不運作了,PHP 都需要有方法來識別出問題并且快速解決。如果沒有完全獨立的執(zhí)行線程,完全獨立的內(nèi)存單元和穩(wěn)定的空間對付每個請求,那底層架構(gòu)就太復(fù)雜以至于不穩(wěn)定因素更容易進(jìn)入到 PHP 系統(tǒng)中。
如果必須要用線程化的 MPM,看看 FastCGI 配置,使 PHP 運行于自己獨立的內(nèi)存空間中。
最后需要指出,不使用線程化 MPM 的警告在 Windows 系統(tǒng)中沒那么強烈,因為 Windows 中的大多數(shù)庫都理應(yīng)在多線程下安全運行。
UNIX 中默認(rèn)在 /usr/local/lib目錄中,也就是 <install-path>/lib。很多人會在編譯時通過 --with-config-file-path標(biāo)記來改變路徑。例如可以將路徑設(shè)為:
--with-config-file-path=/etc
--with-config-file-scan-dir=PATH
Windows 中 php.ini 文件的默認(rèn)路徑在 Windows 目錄下。如果使用的是 Apache 服務(wù)器,則會首先在 Apache 的安裝目錄中尋找 php.ini,例如 C:\Program Files\Apache Group\Apache。這樣同一臺機器上不同版本的 Apache 就可以有不同的 php.ini 文件。
參見 配置文件。
這可能意味著 PHP 發(fā)生了某類錯誤而導(dǎo)致了 core dump。查看服務(wù)器的錯誤日志看看是不是這樣,再用一個小的測試?yán)釉囍噩F(xiàn)此問題。如果你會用“gdb”的話,那么在 bug 報告中提供回溯跟蹤很有助于幫開發(fā)人員查明問題。如果你用 Apache 的模塊方式使用 PHP,試著這么做:
停止 httpd 進(jìn)程
gdb httpd
停止 httpd 進(jìn)程
> run -X -f /path/to/httpd.conf
然后在你的瀏覽器中訪問導(dǎo)致錯誤的 URL
> run -X -f /path/to/httpd.conf
如果你遇到 core dump,gdb 此時就會通知你
輸入:bt
你應(yīng)該在 bug 報告中包括回溯追蹤記錄。應(yīng)該提交到 ? https://github.com/php/php-src/issues
如果你的腳本使用了正則表達(dá)式函數(shù)( ereg()等),應(yīng)該確認(rèn)在編譯 PHP 和 Apache 時使用了同一個正則表達(dá)式包。在 PHP 和 Apache 1.3.x 中應(yīng)該自動就是這樣。
假定你的 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 可以和 FrontPage extensions 一起工作,問題是 FrontPage 補丁修改了幾個 PHP 依賴的 Apache 構(gòu)造。在 FrontPage 補丁安裝之后之后重新編譯 PHP(用“make clean ; make”)可以解決此問題。
用瀏覽器中的“查看源文件”,你可能會發(fā)現(xiàn)能看到 PHP 腳本的源程序。這意味著 web 服務(wù)器沒有把腳本發(fā)送給 PHP 解釋。服務(wù)器配置在某處有問題,請對照 PHP 安裝說明仔細(xì)檢查服務(wù)器配置。
當(dāng)服務(wù)器嘗試運行 PHP 時出了錯。要想看到有意義的錯誤信息,在命令行中轉(zhuǎn)到 PHP 可執(zhí)行程序(Windows 中是 php.exe)所在目錄下并運行 php -i。如果 PHP 運行有任何問題,那么會顯示相應(yīng)的錯誤信息,這將給你下一步要做什么的線索。如果你得到滿屏幕 HTML 代碼( phpinfo()函數(shù)的輸出)的話說明 PHP 本身工作正常,你的問題可能和你的服務(wù)器配置有關(guān),要仔細(xì)檢查。
[mybox:user /src/php4] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd Undefined symbols: _compress _uncompress
這實際上和 PHP 沒有關(guān)系,而和 MySQL 的客戶端庫有關(guān)。有的需要 --with-zlib,有的不需要。這個問題也包括在 MySQL 的 FAQ 中。
這個錯誤信息意味著 PHP 根本就不能產(chǎn)生任何輸出。要想看到有意義的錯誤信息,在命令行中轉(zhuǎn)到 PHP 可執(zhí)行程序(Windows 中是 php.exe)所在目錄下并運行 php -i。如果 PHP 運行有任何問題,那么會顯示相應(yīng)的錯誤信息,這將給你下一步要做什么的線索。如果你得到滿屏幕 HTML 代碼( phpinfo()函數(shù)的輸出)的話說明 PHP 本身工作正常。
一旦 PHP 在命令行中工作正常,試著通過瀏覽器再次訪問腳本。如果還失敗的話那可能是如下原因之一:
ISUR_<machinename>
無權(quán)訪問的。
確認(rèn)需要運行 PHP 腳本的任何用戶有權(quán)限運行 php.exe!IIS 使用了一個在安裝 IIS 時添加的匿名用戶,這個用戶需要有訪問 php.exe的權(quán)限。同樣任何認(rèn)證用戶也需要執(zhí)行 php.exe的權(quán)限。在 IIS4 中你還需要告訴它 PHP 是一個腳本引擎。此外,你可能還需要閱讀 此常見問題。
Security Alert! PHP CGI cannot be accessed directly.
.
必須將
cgi.force_redirect選項設(shè)為
0
。 默認(rèn)值為
1
,因此要確認(rèn)此選項沒有被注釋掉(用
;
)。和其它選項一樣,是在 php.ini 中設(shè)定的。
因為默認(rèn)值是
1
,因此你必須百分之百確認(rèn)使用了正確的 php.ini 文件。詳細(xì)信息請閱讀
此常見問題。
要確認(rèn)你的 php.ini 被 PHP 使用了,調(diào)用
phpinfo(),在接近開頭的位置有一項叫做
Configuration File (php.ini)
。這里將告訴你 PHP 在哪里找到了 php.ini 并且是否使用了。如果只顯示一個目錄則 沒有使用任何 php.ini 文件,你應(yīng)將你的 php.ini 文件放到該目錄中。如果 php.ini 包括在該路徑中則它已被應(yīng)用了。
如果 php.ini 被使用了并且你是以模塊方式運行 PHP 的,確保在修改了 php.ini 之后重新啟動你的 web server。
在 Windows NT,2000,XP 和 2003 下:
進(jìn)入控制面板并打開“系統(tǒng)”圖標(biāo)(開始 -> 設(shè)置 -> 控制面板 -> 系統(tǒng),Windows XP/2003 中是:開始 -> 控制面板 -> 系統(tǒng))
選擇“高級”標(biāo)簽頁
點擊“環(huán)境變量”按鈕
在“系統(tǒng)變量”欄中
找到 Path 這一項(可能需要向下滾動才能找到)
鼠標(biāo)雙擊 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,等等)默認(rèn)就在系統(tǒng)路徑中。但是把文件拷貝到 Windows 系統(tǒng)目錄中這一方式早已不被提倡,還可能造成問題。
有幾種方法可以做到這一點。如果您使用的是 Apache, 請參閱 Apache 文檔,否則 您必須設(shè)置PHPRC環(huán)境變量。
如果到 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 有可能處理任何請求方法,例如 CONNECT。適當(dāng)?shù)幕貞?yīng)狀態(tài)可以用 header()發(fā)送。如果僅需要處理 GET 和 POST 方法,可以通過如下的 Apache 配置實現(xiàn):
<LimitExcept GET POST> Deny from all </LimitExcept>