- 為什麼不應該在生產環境中使用帶有執行緒式 MPM 的 Apache2?
-
PHP 是膠水。它是將數十個第三方函式庫黏合在一起,並透過直觀且易於學習的語言介面,使所有內容看起來像是一個連貫的實體,從而建構酷炫 Web 應用程式的膠水。PHP 的靈活性和強大功能取決於底層平台的穩定性和強健性。它需要一個運作中的作業系統、一個運作中的 Web 伺服器和運作中的第三方函式庫才能黏合在一起。當這些中的任何一個停止運作時,PHP 需要方法來識別問題並快速修復它們。當您透過沒有完全獨立的執行緒、完全獨立的記憶體區段以及每個請求在其中執行的強沙箱來使底層框架更加複雜時,就會將更多的弱點引入 PHP 系統。
如果您想使用執行緒式 MPM,請查看 FastCGI 設定,其中 PHP 在自己的記憶體空間中執行。
- Unix/Windows:我的 php.ini 檔案應該放在哪裡?
-
在 Unix 上,預設情況下它應該在 /usr/local/lib 中,也就是 <install-path>/lib。大多數人會想在編譯時使用 --with-config-file-path 旗標來變更此設定。例如,您可以使用類似以下的方式設定它
--with-config-file-path=/etc
然後您會將發行套件中的 php.ini-development 複製到 /etc/php.ini,並進行編輯以進行任何您想要的本地變更。
--with-config-file-scan-dir=PATH
在 Windows 上,php.ini 檔案的預設路徑是 Windows 目錄。如果您使用 Apache Web 伺服器,則首先會在 Apache 的安裝目錄中搜尋 php.ini,例如 c:\program files\apache group\apache。這樣,您可以在同一台機器上為不同版本的 Apache 使用不同的 php.ini 檔案。
另請參閱關於設定檔的章節。
- Unix:我安裝了 PHP,但是每次載入文件時,都會收到「文件不包含任何資料」的訊息!這是怎麼回事?
-
這可能表示 PHP 遇到某種問題並正在進行核心轉儲。查看您的伺服器錯誤記錄檔,看看是否如此,然後嘗試使用小的測試案例重現問題。如果您知道如何使用 'gdb',那麼當您提供帶有錯誤報告的回溯以幫助開發人員找出問題時,它會非常有幫助。如果您將 PHP 作為 Apache 模組使用,請嘗試類似以下的操作
-
停止您的 httpd 程序
-
gdb httpd
-
停止您的 httpd 程序
-
> run -X -f /path/to/httpd.conf
-
然後使用您的瀏覽器擷取導致問題的 URL
-
> run -X -f /path/to/httpd.conf
-
如果您正在取得核心轉儲,gdb 現在應該會通知您
-
輸入:bt
-
您應該將您的回溯包含在您的錯誤報告中。這應該提交至» https://github.com/php/php-src/issues
如果您的腳本使用正規表示式函式(preg_match() 和朋友),您應該確保您使用相同的正規表示式套件編譯 PHP 和 Apache。這應該使用 PHP 和 Apache 1.3.x 自動發生
- Unix:我使用 RPM 安裝了 PHP,但是 Apache 沒有處理 PHP 頁面!這是怎麼回事?
-
假設您從 RPM 套件安裝了 Apache 和 PHP,您需要在您的 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:我使用 FrontPage 擴充功能修補了 Apache,突然 PHP 停止運作。PHP 與 Apache FrontPage 擴充功能不相容嗎?
-
不,PHP 與 FrontPage 擴充功能運作良好。問題在於 FrontPage 修補程式修改了 PHP 所依賴的幾個 Apache 結構。在應用 FP 修補程式後重新編譯 PHP(使用 'make clean ; make')將會解決問題。
- Unix/Windows:我安裝了 PHP,但是當我嘗試透過瀏覽器存取 PHP 腳本檔案時,會看到空白畫面。
-
在 Web 瀏覽器中執行「檢視原始碼」,您可能會發現您可以看到 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/php5] root# apachectl configtest
apachectl: /usr/local/apache/bin/httpd Undefined symbols:
_compress
_uncompress
-
這實際上與 PHP 無關,而是與 MySQL 用戶端程式庫有關。有些需要 --with-zlib,有些則不需要。MySQL 常見問題中也涵蓋了這一點。
- 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、php5ts.dll、php.ini 或您嘗試載入的任何 PHP 擴充功能的檔案權限設定,導致匿名網際網路使用者
ISUR_<machinename>
無法存取它們。
-
腳本檔案不存在(或者可能不在您認為相對於網站根目錄的位置)。請注意,對於 IIS,您可以在網際網路服務管理員中設定腳本對應時,勾選「檢查檔案是否存在」的方塊來攔截這個錯誤。如果腳本檔案不存在,伺服器將會回傳 404 錯誤。另外,IIS 也會根據您腳本檔案上的 NTLanMan 權限,為您執行任何所需的驗證。
- Windows:我已經依照所有指示操作,但是仍然無法讓 PHP 和 IIS 一起運作!
-
請確保任何需要執行 PHP 腳本的使用者,都有執行 php.exe 的權限!IIS 使用一個在安裝 IIS 時新增的匿名使用者。這個使用者需要 php.exe 的權限。此外,任何經過驗證的使用者也需要執行 php.exe 的權限。對於 IIS4,您還需要告訴它 PHP 是一個腳本引擎。此外,您可能還想閱讀這個常見問題解答。
- 當我使用 IIS、PWS、OmniHTTPD 或 Xitami 將 PHP 作為 CGI 執行時,會出現以下錯誤:
Security Alert! PHP CGI cannot be accessed directly.
。
-
您必須將 cgi.force_redirect 指令設定為 0
。它的預設值是 1
,因此請務必確認該指令沒有被註解掉(以 ;
開頭)。如同所有指令一樣,這是在 php.ini 中設定的。
由於預設值是 1
,因此 100% 確定正在讀取正確的 php.ini 檔案至關重要。請閱讀 這個常見問題解答 以取得詳細資訊。
- 我如何知道我的 php.ini 是否被找到並讀取?看起來好像沒有,因為我的變更沒有被套用。
-
為了確保您的 php.ini 正在被 PHP 讀取,請呼叫 phpinfo()。在最上方附近,會有一個名為 Configuration File (php.ini)
的列表。這會告訴您 PHP 正在哪裡尋找 php.ini,以及是否正在讀取它。如果只有目錄 PATH 存在,則表示它沒有被讀取,您應該將您的 php.ini 放置在該目錄中。如果 php.ini 包含在 PATH 之中,則表示它正在被讀取。
如果 php.ini 正在被讀取,並且您將 PHP 作為模組執行,請務必在變更 php.ini 之後重新啟動您的網頁伺服器。
另請參閱 php_ini_loaded_file()。
- 我如何在 Windows 上讓 PHP 可以使用 php.ini 檔案?
-
有多種方法可以做到這一點。如果您使用 Apache,請參閱 Apache 文件,否則您必須設定 PHPRC 環境變數。
- 是否可以使用 Apache 內容協商(MultiViews 選項)與 PHP?
-
如果 PHP 檔案的連結包含副檔名,一切都運作正常。這個常見問題解答僅適用於 PHP 檔案的連結不包含副檔名,而且您想要使用內容協商從不含副檔名的 URL 中選擇 PHP 檔案的情況。在這種情況下,請將 AddType application/x-httpd-php .php
這行取代為
AddHandler php5-script php
AddType text/html php
這個解決方案不適用於 Apache 1,因為 PHP 模組無法捕捉 php-script
。
- PHP 是否僅限於處理 GET 和 POST 請求方法?
-
不,可以處理任何請求方法,例如 CONNECT。可以使用 header() 發送正確的回應狀態。如果只需要處理 GET 和 POST 方法,可以使用這個 Apache 組態來達成:
<LimitExcept GET POST>
Deny from all
</LimitExcept>