原文来自:https://www.codecasts.com/blo...php
在学习 Laravel 的时候,可能不少人接触的第一个 artisan 的命令就是:php artisan serve
,这样咱们就能够跑起第一个 Laravel 的应用。本文来尝试解读一下这个命令行的源码。laravel
跟以前的源码解读文章同样,我推荐你们能够使用编辑器的搜索功能,直接搜ServeCommand
就能够直接打开这个命令的源码文件,位于 Illuminate\Foundation\Console\ServeCommand
,像其余的 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()
来的,这个方法的源码位于 Illuminate\Foundation\Application
中:编辑器
public function publicPath() { return $this->basePath.DIRECTORY_SEPARATOR.'public'; }
上面的 $this->basePath
就是项目的根目录啦!函数
打印信息,这是经过 fire()
的第二行代码实现的:post
$this->line("<info>Laravel development server started:</info> <http://{$this->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 命令,其中这四个分别对应的是:this
1.下面代码返回 php 的可执行全路径,spa
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的内置服务器没有太大的区别。