首页 > 开发 > PHP > 正文

浅谈Laravel核心解读之Console内核

2024-05-04 22:41:46
字体:
来源:转载
供稿:网友

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']数组后续的元素里。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表