PHP Conference Japan 2024

安裝

本節包含關於如何安裝 PHP 的常見問題。PHP 幾乎適用於任何作業系統和任何 Web 伺服器。

要安裝 PHP,請依照安裝與設定中的指示。

  1. 為什麼不應該在生產環境中使用帶有執行緒式 MPM 的 Apache2?
  2. Unix/Windows:我的 php.ini 檔案應該放在哪裡?
  3. Unix:我安裝了 PHP,但是每次載入文件時,都會收到「文件不包含任何資料」的訊息!這是怎麼回事?
  4. Unix:我使用 RPM 安裝了 PHP,但是 Apache 沒有處理 PHP 頁面!這是怎麼回事?
  5. Unix:我使用 FrontPage 擴充功能修補了 Apache,突然 PHP 停止運作。PHP 與 Apache FrontPage 擴充功能不相容嗎?
  6. Unix/Windows:我安裝了 PHP,但是當我嘗試透過瀏覽器存取 PHP 腳本檔案時,會看到空白畫面。
  7. Unix/Windows:我安裝了 PHP,但是當我嘗試透過瀏覽器存取 PHP 腳本檔案時,會收到伺服器 500 錯誤。
  8. 某些作業系統:我安裝 PHP 時沒有錯誤,但是當我嘗試啟動 Apache 時,會收到未定義的符號錯誤:[mybox:user /src/php5] 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 將 PHP 作為 CGI 執行時,我收到以下錯誤:Security Alert! PHP CGI cannot be accessed directly..
  12. 我如何知道是否已找到並讀取我的 php.ini?似乎沒有,因為我的變更沒有實作。
  13. 如何在 Windows 上將我的 PHP 目錄新增到 PATH?
  14. 如何讓 Windows 上的 PHP 可以存取 php.ini 檔案?
  15. Windows:如何驗證 PHP 是否可以寫入 IIS 下的暫存目錄?
  16. 是否可以使用 Apache 內容協商(MultiViews 選項)與 PHP?
  17. PHP 是否僅限於處理 GET 和 POST 請求方法?
為什麼不應該在生產環境中使用帶有執行緒式 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.exephp5ts.dllphp.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 目錄新增到 PATH

在 Windows 上

  • 前往控制台並開啟「系統」圖示(開始 → 控制台)

  • 前往「進階」標籤

  • 點擊「環境變數」按鈕

  • 查看「系統變數」窗格

  • 找到「Path」項目(您可能需要捲動才能找到它)

  • 雙擊「Path」項目

  • 在結尾輸入您的 PHP 目錄,並在前面加上「;」(例如 ;C:\php

  • 按下「確定」

注意 請務必在執行上述步驟後重新啟動電腦,以確保 PATH 變更已套用。

我如何在 Windows 上讓 PHP 可以使用 php.ini 檔案?

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

Windows:如何驗證 PHP 是否可以寫入 IIS 下的暫存目錄?

  1. 在檔案總管中右鍵點擊暫存目錄 (%TEMP%) 以取得權限。暫存目錄可從組態或 phpinfo() 取得。

  2. 對於 IIS,請檢查使用者 IIS_User 是否具有 MODIFY 權限。

是否可以使用 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>

新增註解

使用者貢獻的註解 5 則註解

per dot fikse at ipj dot no
19 年前
在 Windows Server 2003 x64 上安裝 PHP 4 或 5 會導致 http 錯誤 505。這不是 PHP 的錯誤。這是因為在 64 位元版本的 IIS 6 下執行 32 位元的 ISAPI DLL,如此處所記錄:http://support.microsoft.com/?id=895976

解決方案:翻轉 Enable32bitAppOnWin64 的 Metabase 旗標,如 http://support.microsoft.com/?id=894435 中所述,
像這樣:CSCRIPT ADSUTIL.VBS SET W3SVC/AppPools/Enable32bitAppOnWin64 1

(或者使用完整路徑:cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1)
charleslynch at xybersoftware dot com
16 年前
如果您收到關於沒有執行權限的訊息,以下是最後一個注意事項...您需要在 IIS 中右鍵點擊網站,然後選擇「屬性/首頁目錄」,然後在「執行權限」組合框中,您需要選擇「僅限腳本」...點擊確定...可能會出現另一個對話方塊,詢問要將動作套用到哪些目錄...選擇您打算使用 php 的任何目錄,然後點擊確定...現在應該可以運作了...
emzeperx at emzeper dot hu
18 年前
您不必重新啟動整個系統來讓變更 PATH 環境變數生效。對我來說(sbs2003),它會自動生效。
在舊系統上,您可以使用

set $Path=%path%;c:\php

命令來立即擴充 path 變數。
Curtis
17 年前
我有一些關於 53.7 的額外故障排除提示,它處理在瀏覽器上執行 PHP 腳本時出現空白畫面的問題。

除了伺服器組態錯誤之外,也可能是 PHP 沒有設定為將錯誤輸出到瀏覽器,如果您或您的主機使用更安全的 php.ini,就會發生這種情況。如果是這種情況,您需要找出錯誤記錄的位置,以了解是否有任何錯誤阻止將正常輸出傳遞到客戶端。

如果您可以存取 php.ini,請檢查 'display_errors' 指令,它預設位於 'error_reporting' 指令下方。在偵錯階段開啟 'display_errors' 很有幫助,但在生產環境中最好將其關閉。

相關函數:https://php.dev.org.tw/ini_set | https://php.dev.org.tw/error_reporting | https://php.dev.org.tw/error_log
joerg at fenin dot de
17 年前
若要在執行 PHP 的 Apache 伺服器上限制 HTTP 請求方法,您應該使用 mod_rewrite 或 mod_security 而不是 LimitExcept,以便更精確地控制此類 http 錯誤的處理。可以放在 .htaccess 檔案或 httpd.conf 中

# mod_rewrite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST)$
RewriteRule .* - [F,L]
</IfModule>

# mod_security
<IfModule mod_security.c>
SecFilterSelective REQUEST_METHOD "!^(GET|HEAD|POST)$" "deny,log,status:403"
</IfModule>

您可以使用 askapache 上的 php 請求方法掃描器來確切查看您的伺服器如何處理各種請求方法,並檢查您的伺服器是否已正確設定。

http://www.askapache.com/online-tools/request-method-scanner/
To Top