资讯专栏INFORMATION COLUMN

源码解读:php artisan serve

Loong_T / 3421人阅读

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

原文来自:https://www.codecasts.com/blo...

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

代码在哪

跟之前的源码解读文章一样,我推荐大家可以使用编辑器的搜索功能,直接搜ServeCommand 就可以直接打开这个命令的源码文件,位于 IlluminateFoundationConsoleServeCommand,像其他的 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() 来的,这个方法的源码位于 IlluminateFoundationApplication 中:

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的内置服务器没有太大的区别。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23143.html

相关文章

  • Laravel php artisan optimize 源码解读

    摘要:确定的代码位于的中这样一看,其实就是将文件删除,而这个是会自动生成的一个数组文件,这里指定了每个和的位置和命名空间的全路径等,在启动项目的时候,可以直接读取使用。所以这个命令可以拆为两步层面优化加载速度删除很清晰。 原文:https://www.codecasts.com/blo... 在部署 Laravel 项目的时候,我们经常会使用到一个提升性能的命令: php artisan o...

    brianway 评论0 收藏0
  • 源码解读:Laravel php artisan route:cache

    摘要:然而,本文的讨论重点,还是背后的源码,是怎么做到这一步的。从哪开始看源码位于你还是可以使用编辑器搜,就可以看到源码了。第三步序列化所有路由注册映射关系,还是在的方法中上面的方法位于中的中。所以到这里,的源码解读就完成了。 学 Laravel 和 Vuejs 你真应该来 codecasts.com ! Laravel ​route:cache 可以直接缓存路由文件,这样其实可以在一定程度...

    wangzy2019 评论0 收藏0
  • Laravel 源码解读php artisan make:auth

    摘要:添加路由在方法中,通过下面几行代码添加路由注意这个参数,就是将这个文件的内容附加在原来路由文件的后面,并不会将原来的路由清零。 学 Laravel 和 Vuejs,你真应该来 codecasts.com ,有免费高质量视频! 在 Laravel 5.2 的时候,官方给我们提供了 make:auth 命令,这个命令使得我们在执行一条命令的情况下实现用户注册和登录,忘记密码,找回密码的过程...

    xorpay 评论0 收藏0
  • "php artisan serve"到底干了什么

    摘要:最近看了一下这个框架,写点东西当个笔记。函数会迭代属性为的,逐一将其注册,的方法继承自父类,关键的就是在这个里注册的。 最近看了一下 laravel 这个框架,写点东西当个笔记。跟着官网上的说明 install 好一个项目后,在项目根目录执行命令php artisan serve就可以开启一个简易的服务器进行开发,这个命令到底做了什么,看了一下代码,在这里简要描述一下自己的看法。 先说...

    TANKING 评论0 收藏0
  • Laravel核心解读 -- 用户认证系统(基础介绍)

    摘要:系统的核心是由的认证组件的看守器和提供器组成。使用的认证系统,几乎所有东西都已经为你配置好了。其配置文件位于,其中包含了用于调整认证服务行为的注释清晰的选项配置。 用户认证系统(基础介绍) 使用过Laravel的开发者都知道,Laravel自带了一个认证系统来提供基本的用户注册、登录、认证、找回密码,如果Auth系统里提供的基础功能不满足需求还可以很方便的在这些基础功能上进行扩展。这篇...

    RebeccaZhong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<