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 -S localhost:8000 啓動,則只有本機能訪問,且瀏覽器要輸入localhost,很不方便!!!

上述命令會新啓動一個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.phphttps://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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章