[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操作
时间: 2024-11-03 21:49:51

[Modern PHP] 第二章 新特性之七 内置HTTP服务器的相关文章

[Modern PHP] 第二章 新特性之五 闭包

闭包 闭包和匿名函数是从PHP 5.3.0开始出现的,这是我最喜欢也是用的最多的PHP功能.听到这些名称心里特别没底(至少我第一次听到时是这么认为的),但是事实上真的很好理解.它们是每个PHP开发者们的工具箱中必备的最有用的工具. 闭包作为一个函数,在创建时会封装外部的状态.即使最初创建闭包时的环境已经不存在了,封装的状态也会一直保存在闭包中.这是一个不太好掌握的概念,一旦你能够弄明白,感觉就像人生翻开了新的篇章. 匿名函数实际上就是没有名字的函数.匿名函数可以被赋值给变量,像所有其它的PHP对

下载PHPDroid: 基于WebView和PHP内置HTTP服务器开发Android应用

基于Android上的PHP(比如我打包的PHPDroid),寥寥几行PHP代码,就能实现一个支持无线局域网用浏览器访问的Android手机的Shell,用于执行命令和PHP代码.       个人在Ubuntu上使用交叉编译工具链  arm-none-linux-gnueabi 或 musl-cross-compilers(推荐)  按照  DroidPHP 的教程 cross_compile_php.txt 这是我使用musl-cross-compilers交叉编译Android版PHP7的

PHP 5.4版本有 内置 web 服务器,赞!

PHP是一种脚本语言,它需要PHP解释器来分析运行PHP文件.当把PHP做为CGI服务Web请求时,它需要被嵌入到某种Web服务器里,最常 见的是集成到Apache或IIS里,这就是说,在使用PHP前,你需要安装Apache或IIS,并且正确的配置它们和PHP集成的参数.虽然这种配置 已经很规范,文档非常丰富,但我们还是经常在安装Apache和PHP集成时遇到问题,而且,有时候我们只想测试一个简单的PHP特征,不想就为此安装. 启动Apache服务. 但据官方文档上说,这个内置的Web服务器只是

PHP 5.4 内置Web服务器

PHP是一种脚本语言,它需要PHP解释器来分析运行PHP文件.当把PHP做为CGI服务Web请求时,它需要被嵌入到某种Web服务器里,最常见的是集成到Apache或IIS里,这就是说,在使用PHP前,你需要安装Apache或IIS,并且正确的配置它们和PHP集成的参数.虽然这种配置已经很规范,文档非常丰富,但我们还是经常在安装Apache和PHP集成时遇到问题,而且,有时候我们只想测试一个简单的PHP特征,不想就为此安装.启动Apache服务. 但据官方文档上说,这个内置的Web服务器只是提供开

PHP 5.4 内置 web 服务器

之前 OSC 翻译了一篇文章:在 Windows 上使用 PHP 5.4 内置的 Web 服务器 下面这篇文章来自外刊IT评论翻译的在 Linux 下使用 PHP 5.4 内置 Web 服务器 PHP是一种脚本语言,它需要PHP解释器来分析运行PHP文件.当把PHP做为CGI服务Web请求时,它需要被嵌入到某种Web服务器里,最常 见的是集成到Apache或IIS里,这就是说,在使用PHP前,你需要安装Apache或IIS,并且正确的配置它们和PHP集成的参数.虽然这种配置 已经很规范,文档非常

Python内置的服务器的使用

cd 到某一文件 Python内置的服务器: E:\myObject\office\netObject\new-gcms> python -m SimpleHTTPServer 8888 如果是Python 3+ python -m http.server 8888 当本地服务器运行起来时,即可访问 http://localhost:8888/ 原文地址:https://www.cnblogs.com/lvshoutao/p/9463073.html

CSS3的新特性 行内盒子before和after

CSS3的新特性 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>before after</title> 6 <style type="text/css"> 7 /*在DIV1盒子内部前面*/ 8 #div1:before{ 9 width: 100p

第二十五章 面向对象------封装、内置函数、反射、动态导入

1.封装 什么是封装? 1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:就是为了能够限制外界对内部数据的访问 python中属性的权限分为两种: 1.公开的 没有任何限制,谁都可以访问 2.私有的 只有当前类本身能狗访问 默认为公共的 为什么要封装? 1.提高安全性 封装属性 2.隔离复杂度 封装方法 一个类中分为两种数据:属性和方法 封装属性 class Student: def __init__(self,name,ag

[Unity Shader] 坐标变换与法线变换及Unity5新增加的内置函数

学习第六章Unity内置函数时,由于之前使用mul矩阵乘法时的顺序与书中不一致,导致使用内置函数时出现光照效果不一样,因此引出以下两个问题: 1 什么时候使用3x3矩阵,什么时候使用4x4矩阵? 2 法线变换矩阵与坐标变换矩阵不相同? 解答1: 4.9.1节书中讲述了何时使用3x3和4x4矩阵.因为4x4矩阵是比3x3矩阵多了平移变换,因此对空间坐标进行变换时,通常使用4x4矩阵.而对于切线和法线这两种空间矢量,不存在平移的情况,因此仅使用3x3矩阵即可(是否可以偷懒使用4x4矩阵?是可以的).