php 內建的 web 伺服器
php 內建的 web 伺服器
從 PHP 5.4.0 起,PHP內建了Web伺服器,這對於認為需要Apache或Nginx才能預覽PHP應用的開發者來說又是一個隱藏功能。這個內建的Web伺服器不應該用於生產環境,但對於本地開發來說是個極好的工具。Laravel Valet 起初就是使用這個內建的伺服器,但是在1.1.0版本後將其替換為Caddy(檢視相關新聞)。
1、啟動
這個內建的Web伺服器很容易啟動,開啟終端(Windows下對應是cmd命令列),進入專案根目錄,執行如下命令即可:
php -S localhost:8000
(注意點:要安裝php,並且php是全域性環境)
上述命令會新啟動一個PHP Web伺服器,地址是localhost
,監聽的埠是8000
,當前所在目錄就是這個Web伺服器的根目錄。
現在,開啟瀏覽器,訪問http://localhost:8000
就可以預覽應用了。(執行期間,doc視窗不能關閉!)在Web瀏覽器中瀏覽應用時,每個HTTP請求的資訊都會記錄到終端的標準輸出中,因此我們可以檢視應用是否丟擲了404或500響應:
有時候我們需要在同一區域網中的另一臺裝置中訪問這個伺服器(例如iPad或本地虛擬機器),為此,我們可以把localhost
換成0.0.0.0
,讓PHP Web伺服器監聽所有介面:
php -S 0.0.0.0:8000
要想停止Web伺服器,可以關閉終端,也可以按Ctrl+C快捷鍵。
2、配置
應用常常需要使用專屬的PHP配置檔案,尤其是對記憶體使用、檔案上傳、分析或對位元組碼快取有特殊要求時,一定要單獨配置,我們可以使用-c
選項,讓PHP內建的伺服器使用指定的配置檔案:
php -S localhost:8000 -c app/config/php.ini
3、路由指令碼
PHP內建伺服器明顯遺漏了一個功能:與Apache和Nginx不同,它不支援.htaccess
檔案,因此,這個伺服器很難使用多數流行的PHP框架中常見的前端控制器(單一入口檔案index.php
,用於轉發所有HTTP請求,現在主流PHP框架如Laravel、Symfony都是這樣)。
PHP內建伺服器使用路由指令碼彌補了這一缺憾,處理每個HTTP請求前,會先執行這個路由指令碼,如果結果為false
,返回當前HTTP請求中引用的靜態資源URI,否則會把路由指令碼的執行結果當做HTTP響應主體返回。換句話說,路由指令碼的作用其實和.htaccess
一樣。
路由指令碼的用法很簡單,只需要在啟動PHP內建伺服器時指定這個PHP指令碼檔案的路徑即可:
php -S localhost:8000 router.php
關於路由指令碼,有興趣的同學可以研究下Laravel Valet底層的server.php
(https://github.com/laravel/valet/blob/master/server.php)。
4、判斷函式
有時候需要知道PHP指令碼使用的是PHP內建的Web伺服器還是使用傳統的Web伺服器,這樣方便我們為不同伺服器設定不同的響應頭。我們可以使用php_sapi_name()
函式檢查使用的是哪個PHP Web伺服器,如果當前指令碼使用的是PHP內建伺服器,則該函式返回字串cli-server
:
<?php if (php_sapi_name() == ‘cli-server') { // PHP 內建 Web 伺服器 } else { // 其他Web伺服器 }
5、缺點
PHP內建的Web伺服器不能在生產環境使用,只能在本地開發環境中使用,這是因為其相比Apache或Nginx有諸多不足:
- 效能不佳。一次只能處理一個請求,其他請求會受到阻塞。如果某個程式耗時較長(資料庫查詢、遠端API呼叫),則整個Web應用會陷入停頓狀態。
- 支援媒體型別較少(這一點PHP 5.5.7以後有較大改進)。
- 路由指令碼僅支援少量的URL重寫,更高階則還是需要Apache或Nginx
相關文章
- PHP 之內建 Web 伺服器PHPWeb伺服器
- PHP 5.4 內建web伺服器PHPWeb伺服器
- PHP 基礎 - 內建伺服器PHP伺服器
- 使用PHP內建web伺服器,實現簡單的除錯應用PHPWeb伺服器除錯
- php 內建函式PHP函式
- 啟動PHP內建FastCGIServer的指令碼PHPASTServer指令碼
- PHP內建字串函式實現PHP字串函式
- PHP內建攔截器初步介紹PHP
- 構建高效能web之路------web伺服器長連線Web伺服器
- PHP HTTP 500 - 內部伺服器錯誤PHPHTTP伺服器
- 利用 PHP 反射實現內建函式文件PHP反射函式
- 伺服器組建內網有和作用伺服器內網
- 伺服器組建內網什麼作用伺服器內網
- 如何判斷微信內建瀏覽器(JS & PHP)瀏覽器JSPHP
- 在Java web伺服器內使用url rewrite(轉)JavaWeb伺服器
- 將Oracle 10g內建的安全特性用於PHP(轉)Oracle 10gPHP
- 基於樹莓派的內網穿透Web伺服器搭建樹莓派內網穿透Web伺服器
- 伺服器組建內網有什麼作用伺服器內網
- 基於內建web工作流的政府OA解決方案Web
- TinyWeb–C++構建高效能Web伺服器WebC++伺服器
- LNMP構建高可用WEB伺服器安裝篇LNMPWeb伺服器
- php內建函式分析之array_fill_keys()PHP函式
- 10個你不一定知道的PHP內建函式PHP函式
- PHP不使用任何內建函式實現字串翻轉PHP函式字串
- 搭建手機web伺服器-----內網穿透(無需Root)Web伺服器內網穿透
- Vue的內建指令Vue
- PHP web 安全PHPWeb
- IO 模型 select 編寫多程式 Web 伺服器 PHP 版模型Web伺服器PHP
- WEB伺服器防盜鏈_HttpAccessKeyModule_Referer(Nginx&&PHP)Web伺服器HTTPNginxPHP
- 給PHP開發者的建議PHP
- 構建自己的 PHP 框架PHP框架
- Web伺服器的原理Web伺服器
- TS+Nodejs+Express構建用於前端除錯的WEB伺服器NodeJSExpress前端除錯Web伺服器
- PHP開發內部規範,歡迎提出優化建議PHP優化
- 使用 frp 搭建內網穿透伺服器 Web 使用例項FRP內網穿透伺服器Web
- [Apache][Nginx]構建僅對團隊內部公開使用的web應用ApacheNginxWeb
- php原生socket之IO多路複用以及實現web伺服器PHPWeb伺服器
- Nginx 0.7.x + PHP 5.2.6(FastCGI)搭建高效能web伺服器NginxPHPASTWeb伺服器