如何使用 PHP 的內置 Web 服務器快速測試網站

已發表: 2022-08-11

顯示 PHP 徽標的插圖

需要快速啟動 Web 服務器來測試 PHP 應用程序? PHP 解釋器有一個內置的! 您可以使用它來快速檢查您的工作,而無需運行 Apache、NGINX 或容器化解決方案。

PHP 的集成服務器相對較少受到關注,但對於開發目的來說非常強大。 在本指南中,我們將展示如何使用它作為其他微服務器的替代品,例如 Python 的 SimpleHTTPServer 或 http-server npm 包,它們都不能執行 PHP 腳本。

使用內置服務器

內置服務器是一種便利機制,可幫助您在缺乏成熟 HTTP 服務器的環境中測試 PHP 站點。 它在 PHP 5.4 和所有更高版本中可用。 您可以直接從工作目錄運行它,而無需先設置虛擬主機。

在使用服務器之前,請注意它僅供開發使用。 PHP 文檔明確警告不要在生產應用程序前部署此服務器。 在可公開訪問的網絡上公開它不夠安全。

啟動服務器

通過將-S標誌傳遞給php可執行文件來啟動服務器:

 $ php -S 本地主機:8080
[Fri Jun 10 16:00:00 2022] PHP 8.1.5 Development Server (http://localhost:8080) 啟動

給命令的參數指定服務器的監聽地址。 在上面的示例中,我們在localhost上使用了端口8080 。 現在您可以在 Web 瀏覽器中訪問http://localhost:8080以訪問工作目錄中的內容。 當您請求它們時,任何 PHP 腳本都會自動執行。

您可以通過在啟動服務器時設置-t標誌來提供工作目錄之外的路徑:

 $ php -S localhost:8080 -t /home/$USER/public_docs

文檔根目錄現在將是您的主文件夾中的/public_docs

使用 Web 服務器時,請保持終端窗口打開。 完成網站測試後,按 Ctrl+C 終止該進程。 PHP 會將每個傳入的請求記錄到您的終端窗口中,包括 URI 和 HTTP 方法。 任何未捕獲的 PHP 錯誤也會顯示在日誌中。

啟用遠程訪問

localhost上偵聽將不允許來自網絡上其他設備的傳入連接。 您可以通過綁定到0.0.0.0來允許遠程訪問:

 $ php -S 0.0.0.0:8080

請記住,服務器並未針對生產用途進行強化,也不應公開。 僅在絕對必要時才允許遠程訪問,例如在移動設備上測試特定功能時。 確保您使用的端口未對互聯網開放。

請求回退匹配

當傳入請求缺少 URI 組件時,PHP 將在活動文檔根目錄中查找index.phpindex.html文件。 如果這些文件都不存在,服務器將繼續向上移動目錄樹,在您的文檔根目錄的父目錄之一中查找索引。 這意味著您可能會無意中最終提供位於您指定目錄之外的內容。 當到達樹的頂部而沒有找到索引文件時,將發出 404 Not Found 狀態。

包含 URI(例如/file )的請求必須與文檔根目錄中的靜態文件完全匹配。 否則將返回 404。 對於最流行的文件擴展名,PHP 自動將Content-Type響應標頭設置為所服務文件的 MIME 類型。

使用路由器腳本

您可以選擇將 Web 服務器配置為在每個請求上調用腳本。 這使您可以使用應用程序的前端控制器來執行高級動態路由。

啟動服務器時,通過在命令行上提供 PHP 文件名來啟用路由器功能:

 $ php -S localhost:8080 router.php

PHP 現在將使用router.php來處理每個傳入的請求。 您可以通過檢查請求 URI 將用戶路由到應用程序中的適當點:

 if ( $_SERVER [ "REQUEST_URI" ] === "/dashboard" ) {
    需要一次dashboard.php   
}
否則if ( $_SERVER [ "REQUEST_URI" ] === "/profile" ) {
    要求一次profile.php   
}
否則{
    要求一次404.php   
}

路由器腳本產生的輸出將成為發送回客戶端的響應。 一個例外是腳本返回false :在這種情況下,PHP 將回退到返回與原始請求 URI 匹配的靜態文件。

 if ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) {
    // 路由到正確的 API 端點
    // ...
}
否則{
    // 靜態服務其他路由
    返回
}

從您的 PHP 代碼中檢測內置服務器

您的 PHP 代碼可以通過檢查活動接口名稱來檢測它是否被內置 Web 服務器調用。 php_sapi_name()函數提供了這個值。 當腳本被集成服務器組件調用時,它將被設置為cli-server

 if ( php_sapi_name ( ) === "cli-server" ) {
    enable_development_mode ( ) ;
}

同時處理多個請求

服務器默認運行在單進程同步模式下。 請求被單獨處理並相互阻止執行,直到它們完成。 這也是服務器不適合生產使用的原因之一。

PHP 7.4 添加了對同時處理多個請求的支持。 它依賴於fork()可用性並且在 Windows 上不起作用。 啟用此模式後,服務器將派生一個新的工作人員來服務每個傳入的請求。 您可以通過將PHP_CLI_SERVER_WORKERS環境變量設置為您想要的工作人員數量來激活它:

 $ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

此功能在 PHP 8.1 中仍被標記為實驗性的。

概括

PHP 有一個內置的 Web 服務器,它是一種方便的方式來測試您的應用程序並在您的本地網絡上快速公開本地文件系統內容。 它支持 PHP 腳本執行、包羅萬象的路由和具有最常見 MIME 類型的靜態文件。

儘管服務器現在支持可選的分叉模式,但不建議在生產中使用它。 它旨在作為開發輔助工具,缺少公共部署所需的自定義和安全功能。 它擅長的地方是作為傳統開發平台(如 WAMP、XAMPP 和 Docker 容器)的輕量級和集成替代品。