【Mordern PHP】怎样启用 PHP内置的HTTP服务器?

PHP内置的HTTP服务器

知道吗,从PHP5.4.0起,PHP内置了Web服务器?这对认为需要 Apache或 nginx才能预览
PHP应用的PHP开发者来说又是一个隐藏的功能。这个内置的Web服务器不应该在生产
环境中使用,但对本地开发来说是个极好的工具。

不管写不写PHP代码,我每天都会使用PHP内置的这个Web服务器。我使用这个服务器
预览使用Laravel(http://laravel.com)和Slim框架(http://slimframework.com)开发的应
用,使用内容管理框架 Drupal 架设的网站,以及单纯使用标记语言编写的静态HTML和
CSS。

建议: 记住,PHP内置的是一个Web服务器。这个服务器知道怎么处理HTTP协议,能伺服静态资
源和PHP文件。使用它,我们无需安装MAMP、WAMP或大型Web服务器,就能在本地编
写并预览HTML。

启动这个服务器

这个 PHP Web服务器很容易启动。打开终端应用,进入项目文档的根目录,然后执行下
述命令即可

php -S localhost:4000

上述命令会新启动一个 PHP Web服务器,地址是localhost这个服务器监听的端口是
4000当前工作目录是这个web服务器的文档根目录。

现在,我们可以打开Web浏览器,访问http://localhost:4000,这样就能预览应用了。在
Wcb浏览器中浏览应用时,每个HTTP请求的信息都会记录到终端应用的标准输出中,因
此,我们可以查看应用是否抛出了400或500响应。
有时,我们需要在同一局域网中的另一台设备中访问这个 PHP Web服务器(例如,在
iPad或本地 Windows虚拟机中预览应用)。为此,我们可以把localhost换成0.0.0.0,
让 PHP Web服务器监听所有接口

php -S 0.0.0.0:4000

想停止 PHP Web服务器时,可以关闭终端应用,也可以按Ctrl+C键。

配置这个服务器

应用经常需要使用专属的PHP初始化配置文件,尤其是对内存用量、文件上传、分析或
字节码缓存有特殊要求时,一定要单独配置。我们可以使用-c选项,让PHP内置的服务
器使用指定的初始化文件

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

建议:最好把自定义的初始化文件放在应用的根目录中。如果需要和团队中的其他开发者分享,
还可以把初始化文件纳入版本控制系统。

路由器脚本

PHP内置的服务器明显遗漏了一个功能:与 Apache和 nginx不同,它不支持 .htaccess
件。因此,这个服务器很难使用多数流行的PHP框架中常见的前端控制器。

注意: 前端控制器是一个PHP文件,用于转发所有HTTP请求(通过htaccess文件或重写规则实
现)。前端控制器文件的职责是,分发请求,以及调度适当的PHP代码。 Symfony和其他流
行的框架都使用了这种模式。

PHP内置的服务器使用路由器脚本弥补了这个遗漏的功能。处理每个HTTP请求前,会先
执行这个路由器脚本,如果结果为false,返回当前HTTP请求中引用的静态资源URI。合
则,把路由器脚本的执行结果当做HTTP响应主体返回。换句话说,路由器脚本的作用
其实和 htaccess 文件一样。

路由器脚本的用法很简单,只需在启动PHP内置的服务器时指定这个PHP脚本文件的路

php -S localhost:8000 router.php

查明使用的是否为内置的服务器

有时需要知道PHP脚本是使用PHP内置的Web服务器伺服的还是使用传统的Web服务器
(例如 Apache或 nginx)伺服的。之所以想知道这一点,或许是因为想为 nginx设定某个
首部(例如 Status:),而不想为PHP内置的web服务器设置。我们可以使用 php_sapi_name()
函数查明使用的是哪个 PHP Web服务器。如果当前脚本由PHP内置的服务器伺
服,这个函数会返回字符串c1i-server:

<: php
if (php_sapi_name()==='cli-server'){
//PHP内置的Web服务器
} else
//其他Web服务器
}

缺点

PHP内置的web服务器不能在生产环境使用,只能在本地开发环境中使用。如果在生
产设备中使用PHP内置的Web服务器,会让很多用户失望,还会收到 Pingdom(https:
www.pingdom.com)发出的大量下线通知。

  • 内置的服务器性能不是最好的,因为一次只能处理一个请求,其他请求会受到阻
    塞。如果某个PHP文件必须等待慢速的数据库查询得到结果或远程API返回响应,
    Web应用会处于停顿状态。

  • 内置的服务器只支持少量的媒体类型(http://bit.ly/built-in-ws)。

  • 内置的服务器通过路由器脚本支持少量的URL重写规则。如果需要更高级的URL重
    写规则,要使用 Apache或 nginx。

内容来源: 书籍 Mordem php

你可能感兴趣的:(PHP)