现代 PHP 新特性 —— 内置的 HTTP 服务器 (转)

转自 https://laravelacademy.org/post/4422.html

从 PHP 5.4.0 起,PHP内置了Web服务器,这对于认为需要Apache或Nginx才能预览PHP应用的开发者来说又是一个隐藏功能。这个内置的Web服务器不应该用于生产环境,但对于本地开发来说是个极好的工具。Laravel Valet 起初就是使用这个内置的服务器,但是在1.1.0版本后将其替换为Caddy(查看相关新闻)。

1、启动

这个内置的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快捷键。

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

关于路由脚本,有兴趣的同学可以研究下Laravel Valet底层的server.phphttps://github.com/laravel/valet/blob/master/server.php)。

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。

原文地址:https://www.cnblogs.com/cshaptx4869/p/10778217.html

时间: 2024-08-29 10:58:23

现代 PHP 新特性 —— 内置的 HTTP 服务器 (转)的相关文章

Sql Server 2016 新功能——内置的 Temporal Tables

放假之前老大跟我提起了一下2016有个有趣的功能叫 Temporal Table ,今天去看了一下资料整理一下. 这个功能看上去像是临时表,但是其实是系统维护的一个历史记录表.(在某个程度上面比起我们手动维护的历史表应该方便了一点的) 简单直接的说,它的界面看起来是这样的(就像是T1一样) 创建了之后,就会在下面有一个T1History的表中表来记录. 然后我们来试下怎么去玩这个功能.首先,确认你的Sql Server 版本是2016.然后我们通过一个这样的语句来创建表 Use Test go

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

内置HTTP服务器 你知道PHP从5.4.0开始有了一个内置的web服务器吗?对于那些只知道使用Apache或者nginx去预览PHP页面的PHP开发者们来说这又是一块未被发掘的宝石.虽然你不能在产品环境中使用PHP的内置web服务器,但是这个功能对于本地开发来说真是的一个完美的工具. 无论我是否在写PHP代码,反正每天都会使用PHP的内置web服务器.我会使用它来预览Laravel和Slim Framework(译者注:框架的作者就是本书的作者Josh Lockhart)应用程序,在使用Dru

ES8新特性

ES8已经正式发布了,其新特性有:字符串填充.异步函数与共享内存与原子操作等.本文对着三个特性进行深入的解析.当然还有其他的一些特性. 1.字符串填充 ES8中为字符串添加了新的内置函数padStart().padEnd(),主要用于固定字符串的长度并且用指定的字符进行填充,以padStart为例,其例子如下: 1 var sourceStr="example", 2 targetLen=5, 3 padStr="foobar"; 4 sourceStr.padSt

Java Server Pages 内置对象

JSP九大内置对象: a.JSP内置对象是Web容器创建的一组对象,[不使用new关键字]就可以使用的内置对象.例如:out b.JSP九大内置对象: 五大常用对象:   out,request,response,session,application 其余四大对象:   Page,pageContext,exception,config 1.out内置对象: 2.request内置对象,常用方法如下: request 对象是 javax.servlet.httpServletRequest类型

下载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的

HTML5的新特性

HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.footer.header.nav.section 新的表单控件,比如 calendar.date.time.email.url.search 一.html5视频: 直到现在,仍然不存在一项旨在网页上显示视频的标准. 今天,大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件.

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服务器只是提供开

myeclipse内置tomcat 打开web应用程序

前言: 会用下载好的tomcat8 部署网页程序. 在任意一个浏览器 如 uc   输入http://localhost:8080/项目名  文件名 即可. 注意的是 项目文件需要放到tomcat文件下webapps 目录里. 问题:myeclipse内置了tomcat7.0. 新建一个web project程序. run myeclipse server是as tomcat 7.0后. 用myeclipse内置浏览器 无法打开http://localhost:8080/项目. 服务器是star