一般地,PHP 項目需要搭配 Web 服務器一起使用,如最常見的 NGINX 或 Apache。但有些時候,如果急切需要搭建一個 PHP Web 運行環境,但是又沒有已安裝好的 Web 服務器,此時就輪到 PHP 內置的服務器登場了。
也正因為 PHP 內置服務器可以提供一個便捷 Web 開發環境,很多框架都有提供相應的命令行,如:Yii 的 yii serve
、Laravel 的 artisan serve
。雖然十分方便,當然也有需要注意的點。
用法
首先自然是介紹用法:
1$ php -S localhost:2333 [-t html] [-c php.ini] [router.php]
-S
指定服務器的 Domain/IP 和端口-t
指定根目錄,默認為當前目錄,其默認會執行index.php
或index.html
,如果沒有這兩個文件,則會返回 404-c
指定配置文件router.php
自定義路由
例子
緊接著開始運行我們的 PHP 內置服務器:
1.啟動服務
1$ php -S localhost:2333
2PHP 7.3.4 Development Server started at Fri Apr 26 16:57:36 2019
3Listening on http://localhost:2333
4Document root is /home/razon/html
5Press Ctrl-C to quit.
2.測試
1$ echo "<?php\necho 'hello world';" > index.php
2$ curl http://localhost:2333
3hello world
路由
如果定義了路由,其會接收所有的請求並處理,PHP 將根據路由返回的結果進行下一步操作。
如果返回 false
,那麼將直接返回請求的文件,否則將返回輸出的內容。
1<?php
2if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
3 // 如果是靜態文件,則直接返回
4 return false;
5}
6
7// 其他請求交由 index.php 處理
8require __DIR__ . '/index.php';
注意
雖然 PHP 內置服務器十分便捷,但是也有需要注意的點:
- 不能用於生產環境
- 不能併發處理請求,正因為如此,如果出現了併發問題,我們很難去尋找問題的根源
併發
The web server runs only one single-threaded process, so PHP applications will stall if a request is blocked. —— PHP built-in web server
從官方文檔可以知道,PHP 內置服務器是單線程的進程,其不支持併發處理。
總結
儘管內置服務器十分便利,但是由於其不能併發處理請求,這使得其主要用於簡單的情景。複雜的情景,很可能導致更多的問題。