源码解读:php artisan serve

发布时间:2019-08-07 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了源码解读:php artisan serve脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

代码在哪

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

 public function fire(){
        chdir($this->laravel->publicPath());

        $this->line("<info>Laravel development server started:</info> <http://{$this->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("<info>Laravel development server started:</info> <http://{$this->host()}:{$this->port()}>");

具体效果就是这样:

源码解读:php artisan serve

第三步

执行命令,这个命令是从 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

源码解读:php artisan serve

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

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

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

源码解读:php artisan serve

源码解读:php artisan serve

这样一看,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 serve全部内容,希望文章能够帮你解决源码解读:php artisan serve所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。