Console内核
上一篇文章我们介绍了Laravel的HTTP内核,详细概述了网络请求从进入应用到应用处理完请求返回HTTP响应整个生命周期中HTTP内核是如何调动Laravel各个核心组件来完成任务的。除了处理HTTP请求一个健壮的应用经常还会需要执行计划任务、异步队列这些。Laravel为了能让应用满足这些场景设计了artisan工具,通过artisan工具定义各种命令来满足非HTTP请求的各种场景,artisan命令通过Laravel的Console内核来完成对应用核心组件的调度来完成任务。 今天我们就来学习一下Laravel Console内核的核心代码。
内核绑定
跟HTTP内核一样,在应用初始化阶有一个内核绑定的过程,将Console内核注册到应用的服务容器里去,还是引用上一篇文章引用过的bootstrap/app.php里的代码
<?php// 第一部分: 创建应用实例$app = new Illuminate/Foundation/Application( realpath(__DIR__.'/../'));// 第二部分: 完成内核绑定$app->singleton( Illuminate/Contracts/Http/Kernel::class, App/Http/Kernel::class);// console内核绑定$app->singleton( Illuminate/Contracts/Console/Kernel::class, App/Console/Kernel::class);$app->singleton( Illuminate/Contracts/Debug/ExceptionHandler::class, App/Exceptions/Handler::class);return $app;
Console内核 /App/Console/Kernel
继承自Illuminate/Foundation/Console,
在Console内核中我们可以注册artisan命令和定义应用里要执行的计划任务。
/*** Define the application's command schedule.** @param /Illuminate/Console/Scheduling/Schedule $schedule* @return void*/protected function schedule(Schedule $schedule){ // $schedule->command('inspire') // ->hourly();}/*** Register the commands for the application.** @return void*/protected function commands(){ $this->load(__DIR__.'/Commands'); require base_path('routes/console.php');}
在实例化Console内核的时候,内核会定义应用的命令计划任务(shedule方法中定义的计划任务)
public function __construct(Application $app, Dispatcher $events){ if (! defined('ARTISAN_BINARY')) { define('ARTISAN_BINARY', 'artisan'); } $this->app = $app; $this->events = $events; $this->app->booted(function () { $this->defineConsoleSchedule(); });}
应用解析Console内核
查看aritisan
文件的源码我们可以看到, 完成Console内核绑定的绑定后,接下来就会通过服务容器解析出console内核对象
$kernel = $app->make(Illuminate/Contracts/Console/Kernel::class);$status = $kernel->handle( $input = new Symfony/Component/Console/Input/ArgvInput, new Symfony/Component/Console/Output/ConsoleOutput);
执行命令任务
解析出Console内核对象后,接下来就要处理来自命令行的命令请求了, 我们都知道PHP是通过全局变量$_SERVER['argv']来接收所有的命令行输入的, 和命令行里执行shell脚本一样(在shell脚本里可以通过$0获取脚本文件名,$1 $2这些依次获取后面传递给shell脚本的参数选项)索引0对应的是脚本文件名,接下来依次是命令行里传递给脚本的所有参数选项,所以在命令行里通过artisan脚本执行的命令,在artisan脚本中$_SERVER['argv']数组里索引0对应的永远是artisan这个字符串,命令行里后面的参数会依次对应到$_SERVER['argv']数组后续的元素里。
新闻热点
疑难解答