从 PHP 5.4.0 起,PHP 内置了 Web 服务器,这对于认为需要 Apache 或 Nginx 才能预览 PHP 应用的开发者来说又是一个隐藏功能。这个内置的 Web 服务器不应该用于生产环境,但对于本地开发来说是个极好的工具。
一、启动
这个内置的 Web 服务器很容易启动,打开终端(Windows 下对应是 cmd 命令行),进入项目根目录,执行如下命令即可:
php -S localhost:8000
上述命令会新启动一个 PHP Web 服务器,地址是 localhost,监听的端口是 8000,当前所在目录就是这个 Web 服务器的根目录。
现在,打开浏览器,访问 http://localhost:8000 就可以预览应用了。
在 Web 浏览器中浏览应用时,每个 HTTP 请求的信息都会记录到终端的标准输出中,因此我们可以查看应用是否抛出了 404 或 500 响应
有时候我们需要在同一局域网中的另一台设备中访问这个服务器(例如 iPad 或本地虚拟机),为此,我们可以把 localhost 换成 0.0.0.0,让 PHP Web服务器监听所有接口
php -S 0.0.0.0:8000
要想停止 Web 服务器,可以关闭终端,也可以按 Ctrl+C 快捷键。
二、配置
应用常常需要使用专属的 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
四、判断函数
有时候需要知道 PHP 脚本使用的是 PHP 内置的 Web 服务器还是使用传统的 Web 服务器,这样方便我们为不同服务器设定不同的响应头。
我们可以使用 php_sapi_name() 函数检查使用的是哪个 PHP Web 服务器,如果当前脚本使用的是 PHP 内置服务器,则该函数返回字符串 cli-server:
if (php_sapi_name() == ‘cli-server') {
// PHP 内置 Web 服务器
} else {
// 其他Web服务器
}
五、缺点
PHP 内置的 Web 服务器不能在生成环境使用,只能在本地开发环境中使用,这是因为其相比 Apache 或 Nginx 有诸多不足:
性能不佳。一次只能处理一个请求,其他请求会受到阻塞。如果某个进程耗时较长(数据库查询、远程 API 调用),则整个 Web 应用会陷入停顿状态。
支持媒体类型较少(这一点 PHP 5.5.7 以后有较大改进)。
路由脚本仅支持少量的 URL 重写,更高级则还是需要 Apache 或 Nginx。