現代PHP 內建的HTTP伺服器

2022-09-12 01:09:21 字數 1720 閱讀 6560

從 php 5.4.0 起,php內建了web伺服器,這對於認為需要apache或nginx才能預覽php應用的開發者來說又是乙個隱藏功能。這個內建的web伺服器不應該用於生產環境,但對於本地開發來說是個極好的工具。lar**el valet 起初就是使用這個內建的伺服器,但是在1.1.0版本後將其替換為caddy。

啟動這個內建的web伺服器很容易啟動,開啟終端(windows下對應是cmd命令列),進入專案根目錄,執行如下命令即可:

php -s localhost:8000
上述命令會新啟動乙個php web伺服器,位址是localhost,監聽的埠是8000,當前所在目錄就是這個web伺服器的根目錄。

現在,開啟瀏覽器,訪問http://localhost:8000就可以預覽應用了。在web瀏覽器中瀏覽應用時,每個http請求的資訊都會記錄到終端的標準輸出中,因此我們可以檢視應用是否丟擲了404或500響應:

有時候我們需要在同一區域網中的另一台裝置中訪問這個伺服器(例如ipad或本地虛擬機器),為此,我們可以把localhost換成0.0.0.0,讓php web伺服器監聽所有介面:

php -s 0.0.0.0:8000
要想停止web伺服器,可以關閉終端,也可以按ctrl+c快捷鍵。

配置應用常常需要使用專屬的php配置檔案,尤其是對記憶體使用、檔案上傳、分析或對位元組碼快取有特殊要求時,一定要單獨配置,我們可以使用-c選項,讓php內建的伺服器使用指定的配置檔案:

路由指令碼

php內建伺服器明顯遺漏了乙個功能:與apache和nginx不同,它不支援.htaccess檔案,因此,這個伺服器很難使用多數流行的php框架中常見的前端控制器(單一入口檔案index.php,用於**所有http請求,現在主流php框架如lar**el、symfony都是這樣)。

php內建伺服器使用路由指令碼彌補了這一缺憾,處理每個http請求前,會先執行這個路由指令碼,如果結果為false,返回當前http請求中引用的靜態資源uri,否則會把路由指令碼的執行結果當做http響應主體返回。換句話說,路由指令碼的作用其實和.htaccess一樣。

php -s localhost:8000 router.php
關於路由指令碼,有興趣的同學可以研究下lar**el valet底層的

server.php

判斷函式

有時候需要知道php指令碼使用的是php內建的web伺服器還是使用傳統的web伺服器,這樣方便我們為不同伺服器設定不同的響應頭。我們可以使用php_sapi_name()函式檢查使用的是哪個php web伺服器,如果當前指令碼使用的是php內建伺服器,則該函式返回字串cli-server

<?php 

if (php_sapi_name() == 『cli-server') else

缺點

php內建的web伺服器不能在生成環境使用,只能在本地開發環境中使用,這是因為其相比apache或nginx有諸多不足:

PHP內建伺服器

php在安裝的時候會內建了伺服器的功能,我們在使用的過程中如果只是除錯,可以選擇啟動php內建的伺服器,下面是windows下php內建伺服器的啟動步驟 1 將php的d phpstudy php54 即php.exe所在目錄 新增到環境變數path中。2 開啟dos命令視窗輸入 其中d phpst...

PHP內建伺服器

php在安裝的時候會內建了伺服器的功能,我們在使用的過程中如果只是除錯,可以選擇啟動php內建的伺服器,下面是windows下php內建伺服器的啟動步驟 1 將php的d phpstudy php54 即php.exe所在目錄 新增到環境變數path中。2 開啟dos命令視窗輸入 其中d phpst...

python3 和 php 內建 http 伺服器

寫前端頁面的時候,忍不住想看一下寫成什麼樣了,所以會用到。使用php時,我們可以這樣寫 php s ip 埠 t 站點根目錄 如 php s 127.0.0.1 80 t tmp www不加 t 引數,預設為當前資料夾。使用python時,這樣寫就可以了 bind 為繫結ip d 為指定 根目錄,不...