php 內置的 web 服務器 php -s

從 PHP 5.4.0 起,PHP內置了Web服務器,這對於認爲須要Apache或Nginx才能預覽PHP應用的開發者來講又是一個隱藏功能。這個內置的Web服務器不該該用於生產環境,但對於本地開發來講是個極好的工具。Laravel Valet 起初就是使用這個內置的服務器,可是在1.1.0版本後將其替換爲Caddy(查看相關新聞)。php

一、啓動

這個內置的Web服務器很容易啓動,打開終端(Windows下對應是cmd命令行),進入項目根目錄,執行以下命令便可:前端

php -S localhost:8000  # 進入項目根目錄,執行以下命令便可:

(注意點:要安裝php,而且php是全局環境)laravel

上述命令會新啓動一個PHP Web服務器,地址是localhost,監聽的端口是8000,當前所在目錄就是這個Web服務器的根目錄。git

如今,打開瀏覽器,訪問http://localhost:8000就能夠預覽應用了。(運行期間,doc窗口不能關閉!)在Web瀏覽器中瀏覽應用時,每一個HTTP請求的信息都會記錄到終端的標準輸出中,所以咱們能夠查看應用是否拋出了404或500響應:github

有時候咱們須要在同一局域網中的另外一臺設備中訪問這個服務器(例如iPad或本地虛擬機),爲此,咱們能夠把localhost換成0.0.0.0,讓PHP Web服務器監聽全部接口:數據庫

php -S 0.0.0.0:8000

要想中止Web服務器,能夠關閉終端,也能夠按Ctrl+C快捷鍵。api

二、配置

應用經常須要使用專屬的PHP配置文件,尤爲是對內存使用、文件上傳、分析或對字節碼緩存有特殊要求時,必定要單獨配置,咱們可使用-c選項,讓PHP內置的服務器使用指定的配置文件:瀏覽器

php -S localhost:8000 -c app/config/php.ini

三、路由腳本

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)。

四、判斷函數

有時候須要知道PHP腳本使用的是PHP內置的Web服務器仍是使用傳統的Web服務器,這樣方便咱們爲不一樣服務器設定不一樣的響應頭。咱們可使用php_sapi_name()函數檢查使用的是哪一個PHP Web服務器,若是當前腳本使用的是PHP內置服務器,則該函數返回字符串cli-server:

<?php
if (php_sapi_name() == ‘cli-server') {
    // PHP 內置 Web 服務器
} else {
    // 其餘Web服務器
}

五、缺點

PHP內置的Web服務器不能在生成環境使用,只能在本地開發環境中使用,這是由於其相比Apache或Nginx有諸多不足:

  • 性能不佳。一次只能處理一個請求,其餘請求會受到阻塞。若是某個進程耗時較長(數據庫查詢、遠程API調用),則整個Web應用會陷入停頓狀態。
  • 支持媒體類型較少(這一點PHP 5.5.7之後有較大改進)。
  • 路由腳本僅支持少許的URL重寫,更高級則仍是須要Apache或Nginx

六、總結

  • 當前目錄做爲Root Document只須要這條命令便可:
php -S localhost:3300
  • 也能夠指定其它路徑
php -S localhost:3300 -t /path/to/root
  • 還能夠指定路由
php -S localhost:3300 router.php

七、若是咱們用來測試

咱們用來測來,只須要訪問 localhost 便可

php -S localhost:80 -t D:\phpStudy\WWW\項目目錄
相關文章
相關標籤/搜索