PHP 5.4.0 开始内置了 Web 服务器

之前我是在 xampp 里面的 htdocs 文件夹编写 PHP 文件,然后拷贝到这个项目的 GitHub 文件,现在直接编辑 GitHub 下的文件,然后启动内置的服务器就好了,可以用来简单的预览使用 Laravel等等,以及单纯的一些简单例子

php -S localhost:8888

有时候我们需要在同一个局域网中的另一台设备中访问这个 PHP Web 服务器,我们把 localhost 改成 0.0.0.0 ,让 PHP Web服务监听所有的借口

php -S 0.0.0.0:8888

补充下,这个时候我们就可以配置手机上 wifihttp代理 了,设置成 pc 的地址以及端口,比如:

服务器: 192.168.0.108
端口: 8888

在手机浏览器输入比如:

http://0.0.0.0:8888/ch2/9-Zend-OPcache.php

就能访问到对应的服务器上的 PHP 文件了


另外精彩需要专属的 PHP 初始化配置文件,尤其是那些对内容用量、文件上传、分析或字节码缓存有特许要求的,要单独配置。我们可以使用 -c 选项,让它使用指定的初始化文件:

php -S 0.0.0.0:8888 -c app/config/php.ini

但是和 Apachenginx 不同,不支持 .htaccess 文件,很难使用多数流行的 PHP 框架中常见的 前端控制器(是一个 PHP 文件,用于转发所有 HTTP 请求,通过.htaccess文件或重写规则实现,职责是分发请求,以及适度调试适当的 PHP 代码)

PHP 内置的服务器使用路由脚本弥补这个遗漏的功能,处理每个 HTTP 请求钱,先执行这个路由器脚本,如果为 false 返回当前 HTTP 请求中引用的静态资源 URI ,否则路由器脚本执行的结果当作 HTTP 响应体安徽,和 .htaccess 文件一样

php -S 0.0.0.0:8888 router.php

有时候需要知道 PHP 脚本使用的是内置的还是传统的服务器,是因为想为 nginx 设定某个首部(比如 Status:) 而不为内置服务器设置,我们可以使用

php_sapi_name() 

查看使用哪个服务器。如果是内置服务器,这个函数返回 cli-server

下面是简单的 router.php 文件编写

<?php 
  if(php_sapi_name()==='cli-server'){
    echo '内置服务器';
  }

  if(preg_match('/\.(?:png|jpg|jpeg|gif)$/',$_SERVER['REQUEST_URI'])){
    return false;
  }else{
    echo "<p>Welcome to PHP</p>";
    echo "<pre>";
    print_r(pathinfo($_SERVER["SCRIPT_FILENAME"]));

    print_r($_SERVER);
    echo "</pre>";
  }

  // Array
  // (
  //     [dirname] => /Users/cody1991/Desktop/github/learn/PHP/modernPHP-book/ch2
  //     [basename] => router.php
  //     [extension] => php
  //     [filename] => router
  // )
?>

缺点也有很多

不能用在生产环境,性能不好,一次只能处理一次请求,其他请求会被阻塞,比如某个 PHP 需要慢速的数据库查询或者远程 API 返回,会处于停顿状态

只支持少量的媒体类型

支持少量的 URI 编写规则


最后贴出在手机和电脑上的返回结果:

Array
(
    [DOCUMENT_ROOT] => /Users/cody1991/Desktop/github/learn/PHP/modernPHP-book/ch2
    [REMOTE_ADDR] => 192.168.0.101
    [REMOTE_PORT] => 53220
    [SERVER_SOFTWARE] => PHP 5.6.28 Development Server
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_NAME] => 0.0.0.0
    [SERVER_PORT] => 8888
    [REQUEST_URI] => http://0.0.0.0:8888/ch2/9-Zend-OPcache.php
    [REQUEST_METHOD] => GET
    [SCRIPT_NAME] => /ch2/9-Zend-OPcache.php
    [SCRIPT_FILENAME] => /Users/cody1991/Desktop/github/learn/PHP/modernPHP-book/ch2/router.php
    [PHP_SELF] => /ch2/9-Zend-OPcache.php
    [HTTP_HOST] => 0.0.0.0:8888
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_CONNECTION] => keep-alive
    [HTTP_PROXY_CONNECTION] => keep-alive
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,UC/44,ios_plugin/1
    [HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/14C92 UCBrowser/11.3.5.911 Mobile  AliApp(TUnionSDK/0.1.12) AliApp(TUnionSDK/0.1.12)
    [HTTP_X_UCBROWSER_UA] => dv(iPh7,1);pr(UCBrowser/11.3.5.911);ov(10_2);ss(414x736);bt(UC);pm(0);bv(0);nm(0);im(0);nt(2);
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_ACCEPT_LANGUAGE] => zh-cn
    [REQUEST_TIME_FLOAT] => 1484127203.7722
    [REQUEST_TIME] => 1484127203
)

Array
(
    [DOCUMENT_ROOT] => /Users/cody1991/Desktop/github/learn/PHP/modernPHP-book/ch2
    [REMOTE_ADDR] => 127.0.0.1
    [REMOTE_PORT] => 54002
    [SERVER_SOFTWARE] => PHP 5.6.28 Development Server
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_NAME] => 0.0.0.0
    [SERVER_PORT] => 8888
    [REQUEST_URI] => /10.php
    [REQUEST_METHOD] => GET
    [SCRIPT_NAME] => /10.php
    [SCRIPT_FILENAME] => /Users/cody1991/Desktop/github/learn/PHP/modernPHP-book/ch2/router.php
    [PHP_SELF] => /10.php
    [HTTP_HOST] => localhost:8888
    [HTTP_CONNECTION] => keep-alive
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    [HTTP_ACCEPT_ENCODING] => gzip, deflate, sdch, br
    [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8,en;q=0.6
    [REQUEST_TIME_FLOAT] => 1484126985.1592
    [REQUEST_TIME] => 1484126985
)

完成书本第二章的学习