在学习 Laravel 的时候,可能很多人接触的第一个 artisan 的命令就是:php artisan serve,这样我们就可以跑起第一个 Laravel 的应用。本文来尝试解读一下这个命令行的源码。

代码在哪

跟之前的源码解读文章一样,我推荐大家可以使用编辑器的搜索功能,直接搜ServeCommand 就可以直接打开这个命令的源码文件,位于 Illuminate\Foundation\Console\ServeCommand,像其他的 artisan 命令一样,我们还是关注 fire() 方法:

public function fire(){

chdir($this->laravel->publicPath());

$this->line("Laravel development server started:host()}:{$this->port()}>");

passthru($this->serverCommand());

}

第一步

首先使用 chdir() 将目录改变至 public/ 目录,这是根据 $this->laravel->publicPath() 代码的 publicPath() 来的,这个方法的源码位于 Illuminate\Foundation\Application 中:

public function publicPath()

{

return $this->basePath.DIRECTORY_SEPARATOR.'public';

}

上面的 $this->basePath 就是项目的根目录啦!

第二步

打印信息,这是通过 fire() 的第二行代码实现的:

$this->line("Laravel development server started:host()}:{$this->port()}>");

具体效果就是这样:

第三步

执行命令,这个命令是从 passthru($this->serverCommand()) 的原生函数 passthru() 来实现的,其中 $this->serverCommand() 负责返回一个可以执行的字符串命令,具体代码就在同文件的 serverCommand() 中:

protected function serverCommand()

{

return sprintf('%s -S %s:%s %s/server.php',

ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false)),

$this->host(),

$this->port(),

ProcessUtils::escapeArgument($this->laravel->basePath())

);

}

sprintf() 的四个字符串占位符会被后面传入的四个参数替换,最终打印出一个可以执行的 PHP 命令,其中这四个分别对应的是:

1.下面代码返回 php 的可执行全路径,

ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false))

2.下面代码返回 host ,默认为 127.0.0.1

$this->host()

这部分可以直接查看 host() 方法:

protected function host()

{

return $this->input->getOption('host');

}

这样看来,我们在使用 serve 命令的时候其实是可以传入 host 参数的。

3.下面代码返回 port ,跟 host 是一模一样的:

$this->port()

代码就在 port() 方法中,(使用 serve 命令的时候也是可以直接传入端口号的!):

protected function port()

{

return $this->input->getOption('port');

}

上面的 2 和 3 可以直接这样考证 : 执行php artisan help serve

4.下面的代码返回执行代码的全路径:

ProcessUtils::escapeArgument($this->laravel->basePath())

所以,最后 serverCommand() 返回的是什么呢?我们可以直接打印看看:

这样一看,php artisan serve 命令就是直接使用 php 执行 server.php 文件,这个文件就在项目的根目录下,比如就是相当于我们直接在命令行执行下面这个命令:

php -S 127.0.0.1:8000 server.php

在这基础上,记得指定 public/ 为网站根目录。

最后

php artisan serve 命令背后其实也就是使用了 php 去直接执行文件,跟我们在使用 php -S php -S 127.0.0.1:8000 PHP的内置服务器没有太大的区别。

php artisan实现机制,源码解读:php artisan serve相关推荐

  1. DataNode 心跳机制源码解读

    一.分布式系统中的心跳技术 心跳是分布式技术中常用的技术手段.心跳,顾名思义,就是以固定的频率向其他节点汇报当前节点状态的方式.收到心跳,一般可以认为发送心跳的这个节点在当前的网络拓扑中是良好的. 当 ...

  2. 【阅读源码】Transformer的FFN机制源码解读(dropout)

    class PositionwiseFeedForward(nn.Module):"Implements FFN equation."def __init__(self, d_mo ...

  3. Webpack 模块加载、动态引入机制源码解读

    今天的文章简单探讨一下 Vue 和 React 的不同. 本人 Vue2 和 React 都用过,但不熟悉 Vue3,没用它做过项目. 其实我对这两大框架也没有认真钻研过它们的细节,也就是工作上用它们 ...

  4. php artisan code,源码解读 Laravel PHP artisan config:cache

    再来一篇源码解读系列,其实包含本篇 config:cache 源码解读在内,这三篇的源码解读都是跟线上环境部署 Laravel 项目有关,因为我们通常会使用这三个 artisan 命令来提高项目的执行 ...

  5. Android6.0源码解读之ViewGroup点击事件分发机制

    本篇博文是Android点击事件分发机制系列博文的第三篇,主要是从解读ViewGroup类的源码入手,根据源码理清ViewGroup点击事件分发原理,明白ViewGroup和View点击事件分发的关系 ...

  6. 【注意力机制集锦】Channel Attention通道注意力网络结构、源码解读系列一

    Channel Attention网络结构.源码解读系列一 SE-Net.SK-Net与CBAM 1 SENet 原文链接:SENet原文 源码链接:SENet源码 Squeeze-and-Excit ...

  7. Fabric中PBFT源码解读——Checkpoint机制

    文章目录 1. 写在前面 1.1 前置阅读 1.2 对TestCheckpoint函数的测试 2. 对TestCheckpoint函数运行流程的解读 2.1 Checkpoint和Water mark ...

  8. 【JVM】Java类加载器设计原理(ClassLoader源码解读/ SPI机制/ 绕开双亲委派/ 常见Java虚拟机)

    目录 1. 什么是类加载器 2. 类加载器加载的过程 3. Class文件读取来源 4. 类加载器的分类 5. 那些操作会初始化类加载器 6. 类加载器的双亲委派机制 6.1 双亲委派机制机制的好处 ...

  9. Feflow 源码解读

    Feflow 源码解读 Feflow(Front-end flow)是腾讯IVWEB团队的前端工程化解决方案,致力于改善多类型项目的开发流程中的规范和非业务相关的问题,可以让开发者将绝大部分精力集中在 ...

最新文章

  1. JDK9为何要将String的底层实现由char[]改成了byte[]?
  2. Spring Boot之自动配置
  3. 如果用编程语言参加战争,哪门语言才是程序员的最强武器?
  4. Serverless 工程实践|自建 Apache OpenWhisk 平台
  5. html清除内部所有补白,如何清除行内元素之间的HTML空白
  6. 5_数据分析—数据可视化
  7. 力扣332. 重新安排行程(JavaScript)
  8. 六、DMSP/OLS夜间灯光数据之GDP空间化的反演
  9. Makefile 编写教程(由简至难)
  10. matlab入门(适合初学者)
  11. windows下常见的知识
  12. 解决微信公众号accessToken白名单问题
  13. 油猴Tampermonkey安装使用教程
  14. word2016 上次启动时失败以安全模式能够解决该问题【office专业版】
  15. c++之open_cv 图像的载入、显示与输出
  16. 你以为你以为的三国就是你以为的三国吗——读《三国史话》
  17. Oracle vm visualbox虚拟机双网卡设置-解决主机无法连接靶机的问题
  18. win10计算机管理 用户,Win10专业版系统管理员帐户的开启设置方法
  19. 报错解决:Reason: Failed to determine a suitable driver class
  20. 如何批量添加阿里巴巴图标 iconfont

热门文章

  1. 《交互设计》作业-第四周
  2. 浅谈单片机低功耗处理
  3. Ubuntu18.04 cuda安装
  4. mysql5.7.10 二进制包_mysql 32 位安装教程mysql5.7 二进制包安装
  5. 下班后我都学了什么 | Python 如何高效的遍历DataFrame?
  6. 编写河北大学官网界面
  7. Win10出现0x8000000b错误如何解决?
  8. Centos 通过 Nginx 和 vsftpd 构建图片服务器
  9. vue组件走马灯_Vue-component | 文字走马灯组件
  10. c51中断优先级c语言,51单片机中断优先级设置,中断优先级如何设置