当前位置: 首页 > 后端技术 > PHP

源码解读:phpartisanserve

时间:2023-03-29 15:59:00 PHP

原文来自:https://www.codecasts.com/blo...在学习Laravel的时候,很多人接触到的第一个artisan命令就是:phpartisanserve,所以我们可以运行我们的第一个Laravel应用程序。本文尝试对这个命令行的源码进行解读。代码在哪里,和之前的源码解读文章一样。推荐大家使用编辑器的搜索功能直接搜索ServeCommand打开该命令的源代码文件。它位于Illuminate\Foundation\Console\ServeCommand,和其他工匠命令一样,我们还是关注fi??re()方法:publicfunctionfire(){chdir($this->laravel->publicPath());$this->line("Laravel开发服务器启动:host()}:{$this->port()}>");passthru($this->serverCommand());}第一步是使用chdir()将目录更改为public/目录,这是基于$this->laravel->publicPath()代码。该方法的源代码位于Illuminate\Foundation\Application:publicfunctionpublicPath(){return$this->basePath.DIRECTORY_SEPARATOR.'public';上面的$this->basePath就是项目的根目录!第二步是打印信息,通过fire()的第二行代码实现:$this->line("Laraveldevelopmentserverstarted:host()}:{$this->port()}>");具体效果是这样的:第三步执行命令,是从passthru($this->serverCommand())的原生函数passthru()实现的,其中$this->serverCommand()负责返回一个一个可执行的字符串命令,具体代码在同一个文件的serverCommand()中:(newPhpExecutableFinder)->find(false)),$this->host(),$this->port(),ProcessUtils::escapeArgument($this->laravel->basePath()));}sprintf()中的四个字符串占位符会被后面传入的四个参数代替,最后会打印出一条可执行的PHP命令。这四个分别对应:1、下面代码返回PHPPath的可执行文件全文,ProcessUtils::escapeArgument((newPhpExecutableFinder)->find(false))2、下面代码返回host,默认为127.0.0.1$这个->主机()。这部分可以直接查看host()方法:protectedfunctionhost(){return$this->input->getOption('host');}看来其实我们在使用serve命令的时候可以传入host参数3、以下代码返回端口,与host完全一致:$this->port()代码在port()方法中,(也可以在使用serve命令时直接传入端口号!):protectedfunctionport(){return$this->input->getOption('port');上面的2和3可以这样直接验证:执行phpartisanhelpserve4。下面的代码返回执行代码的完整路径:ProcessUtils::escapeArgument($this->laravel->basePath())那么,serverCommand()最后返回了什么?我们可以直接打印出来:这样phpartisanserve命令就是直接使用php来执行server.php文件。该文件位于项目的根目录中。例如,相当于直接在命令行执行如下命令:php-S127.0.0.1:8000server.php在此基础上,记得指定public/为网站根目录。最后,phpartisanserve命令其实是使用php直接执行文件的,这和我们使用php-Sphp-S127.0.0.1:8000PHP内置服务器没有太大区别。