MyException - 我的异常网
当前位置:我的异常网» PHP » [Modern PHP] 第二章 新特性之7 内置HTTP服务器

[Modern PHP] 第二章 新特性之7 内置HTTP服务器

www.MyException.Cn  网友分享于:2015-08-26  浏览:0次
[Modern PHP] 第二章 新特性之七 内置HTTP服务器

内置HTTP服务器


你知道PHP从5.4.0开始有了一个内置的web服务器吗?对于那些只知道使用Apache或者nginx去预览PHP页面的PHP开发者们来说这又是一块未被发掘的宝石。虽然你不能在产品环境中使用PHP的内置web服务器,但是这个功能对于本地开发来说真是的一个完美的工具。


无论我是否在写PHP代码,反正每天都会使用PHP的内置web服务器。我会使用它来预览Laravel和Slim Framework(译者注:框架的作者就是本书的作者Josh Lockhart)应用程序,在使用Drupal框架的内容管理系统搭建网站时也会使用它,甚至在构造原型页面时使用它来预览静态的HTML和CSS。


记住,PHP内置的服务器是一个web服务器。它只使用HTTP协议,除了PHP文件之外,它还可以返回静态资源。我们可以在不使用MAMP、WAMP或者其它重量级的web服务器的情况下在本地很好的完成HTML页面的开发和预览操作。


启动服务器


启动PHP的web服务器很简单。打开你的终端程序,进入你的项目的文档根目录并执行下面的命令:

php -S localhost:4000


这个命令可以启动一个新的PHP web服务器,我们通过localhost就可以访问这个服务器。它会监听4000端口。而你当前的工作目录就是web服务器的文档根目录。


打开浏览器访问 http://localhost:4000 就可以预览你的应用程序了。由于你使用web浏览器浏览自己的应用程序,每个HTTP请求都会在你的终端程序中记录并直接在终端输出出来,通过它可以检测到你的应用程序是否会出现400或者500错误。


有时候你会需要允许其他的设备来访问你本地环境中的PHP web服务器(例如使用你的iPad或者本地的Windows虚拟机进行预览)。要实现这个需求,你可以让PHP web服务器使用0.0.0.0代替localhost来监听来自所有网络连接的请求。

php -S 0.0.0.0:4000


当你准备停止PHP web服务器时,直接关闭终端程序或者按Ctrl+C就可以了。


配置服务器


一个应用程序对应一个PHP的INI配置文件是很常用的处理,尤其是你的应用程序对内存使用、文件上传、调试或者字节码缓存等有着特别的需求。使用PHP内置服务器时我们可以使用-c参数告诉服务器去使用某个指定的INI文件:

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


把自定义的INI文件放到应用程序的根目录下是很好的主意,甚至可以使用版本控制来保存INI文件,以便与开发团队中的其他开发者们进行共享。


路由脚本


不同于Apache或者nginx,PHP内置服务器有个明显的缺陷:它不支持.htaccess文件。因此很多流行的PHP框架都使用的前端控制器在PHP内置服务器上用起来却很麻烦。


前端控制器是一个单独的PHP文件,所有的HTTP请求都被转发到它上面(通过.htaccess文件或者rewrite规则)。前端控制器文件负责将请求进行路由并分发到对应的PHP代码上。Symfony和其他流行的PHP框架都使用了这个常用的模式。


PHP内置服务器使用路由脚本可以稍微弥补这个缺陷。路由脚本会在每次HTTP请求之前被执行。如果脚本返回false,那么会直接返回当前HTTP请求地址对应的静态资源,反之,则将脚本返回的内容作为HTTP返回内容返回给浏览器。换句话说,你的路由脚本事实上就是在照搬.htaccess文件的功能。


使用路由脚本很简单,只需要将PHP脚本的文件地址作为一个桉树传递给PHP内置服务器的启动命令:

php -S localhost:8000 router.php


判断来自内置服务器的请求


有时候能够区分访问的PHP脚本是来自PHP内置服务器还是类似Apache和nginx的传统的web服务器是很有用的。或许你需要在nginx中添加一个专门的HTTP头(例如 Status:)但是在PHP web服务器上却坐不到。你可以通过php_sapi_name()函数来判断出PHP web server。当你当前请求的脚本是来自PHP内置服务器时这个函数会返回字符串 cli-server:

<?php
if (php_sapi_name() === 'cil-server') {
    // PHP内置web服务器
} else {
    // 其它web服务器
}

缺点


PHP内置web服务器不可以在产品环境中使用。它仅仅是为了本地开发设计。如果你在产品服务器上使用了PHP内置服务器,你将面对的是大量失望的用户以及来自Pingdom的洪水般的当机通知。


  • 内置服务器之所以性能不佳是因为它每次只能处理一个请求,而其他的请求都会被block住。如果一个PHP文件被卡在了慢查询或者远程的API返回上,那你的web应用就无法响应了。
  • 内置服务器只支持有限的MIME类型
  • 内置服务器使用路由脚本限制了URL rewriting。你需要Apache或者nginx来实现更高级的URL rewriting操作

文章评论

10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员应该关注的一些事儿
程序员应该关注的一些事儿
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
那些争议最大的编程观点
那些争议最大的编程观点
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
每天工作4小时的程序员
每天工作4小时的程序员
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
一个程序员的时间管理
一个程序员的时间管理
总结2014中国互联网十大段子
总结2014中国互联网十大段子
10个调试和排错的小建议
10个调试和排错的小建议
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
我是如何打败拖延症的
我是如何打败拖延症的
程序员的鄙视链
程序员的鄙视链
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
 程序员的样子
程序员的样子
我的丈夫是个程序员
我的丈夫是个程序员
程序员必看的十大电影
程序员必看的十大电影
中美印日四国程序员比较
中美印日四国程序员比较
漫画:程序员的工作
漫画:程序员的工作
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员和编码员之间的区别
程序员和编码员之间的区别
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
鲜为人知的编程真相
鲜为人知的编程真相
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
代码女神横空出世
代码女神横空出世
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
程序员都该阅读的书
程序员都该阅读的书
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
编程语言是女人
编程语言是女人
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有