php 内置的 web 服务器

http://php.net/manual/zh/features.commandline.webserver.php
从php5.4开始,引入了一个内置web服务器,可以在测试环境迅速搭建web环境而无须复杂的配置。性能肯定是不如nginx和apache服务器的,生成环境还是要搭建服务器。
命令使用方法:
php -S localhost:8000 [-t /var/www/web]
有时候我们需要在同一局域网中的另一台设备中访问这个服务器(例如iPad或本地虚拟机),为此,我们可以把localhost换成0.0.0.0,让PHP Web服务器监听所有接口:
php -S 0.0.0.0:8000
要想停止Web服务器,可以关闭终端,也可以按Ctrl+C快捷键。
这个内置的Web服务器不应该用于生产环境,但对于本地开发来说是个极好的工具。Laravel Valet 起初就是使用这个内置的服务器,但是在1.1.0版本后将其替换为Caddy

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



<?php
// router.php
if (preg_match(‘/.(?:png|jpg|jpeg|gif)$/’, $_SERVER[“REQUEST_URI”])) {
return false; // serve the requested resource as-is.
} else {
echo “<p>Welcome to PHP</p>”;
}
?>



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



Category php