该 Web 服务器目的是帮助应用程序开发。还可用于测试目的或在受控环境中运行的应用程序演示。但并不是一个功能齐全的 Web 服务器。不应该在公共网络上使用。
CLISAPI 提供了内置的 Web 服务器。
Web 服务器仅运行一个单线程进程,因此如果堵塞了请求,PHP 应用程序将停止运行。
URI 请求将从启动 PHP 的当前工作目录提供服务,除非使用 -t 选项指定文档根目录。如果 URI 请求未指定文件,则返回指定目录中的 index.php 或 index.html。如果两个文件都不存在,则将在父目录中继续查找 index.php 和 index.html,依此类推,直到找到一个文件或到达文档根目录。如果找到 index.php 或 index.html,则将其返回,并将 $_SERVER['PATH_INFO'] 设置为 URI 的尾部部分。否则将返回 404 响应代码。
如果在命令行上启动 Web 服务器时指定了 PHP 文件,则会将其视为“router”脚本。该脚本在每个 HTTP 请求开始时运行。如果此脚本返回 false
,则按原样返回所请求的资源。否则脚本的输出将返回到浏览器。
对于有扩展名的文件,将返回标准的 MIME 类型: .3gp
.apk
.avi
.bmp
.css
.csv
.doc
.docx
.flac
.gif
.gz
.gzip
.htm
.html
.ics
.jpe
.jpeg
.jpg
.js
.kml
.kmz
.m4a
.mov
.mp3
.mp4
.mpeg
.mpg
.odp
.ods
.odt
.oga
.ogg
.ogv
.pdf
.png
.pps
.pptx
.qt
.svg
.swf
.tar
.text
.tif
.txt
.wav
.webm
.wmv
.xls
.xlsx
.xml
.xsl
.xsd
.zip
。
从 PHP 7.4.0 开始,内置 Web 服务器可以配置为派生多个工作线程,以便测试需要向内置 Web 服务器发出多个并发请求的代码。在启动服务器之前,将 PHP_CLI_SERVER_WORKERS 环境变量设置为所需的 worker 数量。
注意: 此功能不支持 Windows。
此实验功能不适用于生产用途。通常,内置 Web 服务器不适合生产用途。
示例 #1 启动 Web 服务器
$ cd ~/public_html $ php -S localhost:8000
终端将显示:
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011 Listening on localhost:8000 Document root is /home/me/public_html Press Ctrl-C to quit
在 URI 请求 http://localhost:8000/ 和 http://localhost:8000/myscript.html 之后,终端会显示类似以下的内容:
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011 Listening on localhost:8000 Document root is /home/me/public_html Press Ctrl-C to quit. [Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read [Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read [Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read [Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read [Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read
请注意,在 PHP 7.4.0 之前,在 Windows 上无法访问符号链接的静态资源,除非 router 脚本可以处理这些资源。
示例 #2 启动时指定文档根目录
$ cd ~/public_html $ php -S localhost:8000 -t foo/
终端将显示:
PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011 Listening on localhost:8000 Document root is /home/me/public_html/foo Press Ctrl-C to quit
示例 #3 使用 router 脚本
在此示例中,请求图像将显示图片,但对 HTML 文件的请求将显示“Welcome to PHP”:
<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
return false; // 原样提供所请求的资源
} else {
echo "<p>Welcome to PHP</p>";
}
?>
$ php -S localhost:8000 router.php
示例 #4 检查 CLI Web 服务器的使用
要在使用 CLI Web 服务器开发期间以及稍后使用生产 Web 服务器重复使用的框架 router 脚本:
<?php
// router.php
if (php_sapi_name() == 'cli-server') {
}
?>
$ php -S localhost:8000 router.php
示例 #5 处理不支持的文件类型
如果需要提供不由 CLI Web 服务器处理的静态资源的 MIME 类型,请使用:
<?php
// router.php
$path = pathinfo($_SERVER["SCRIPT_FILENAME"]);
if ($path["extension"] == "el") {
header("Content-Type: text/x-script.elisp");
readfile($_SERVER["SCRIPT_FILENAME"]);
}
else {
return FALSE;
}
?>
$ php -S localhost:8000 router.php
示例 #6 从远程计算机访问 CLI Web 服务器
可以通过以下方式使 Web 服务器可通过端口 8000 接受任何链接:
$ php -S 0.0.0.0:8000
内置 Web 服务器不应该在公共网络上使用。