亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

淺談Laravel核心解讀之Console內核

2024-05-05 00:05:50
字體:
來源:轉載
供稿:網友

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']數組后續的元素里。

因為artisan命令的語法中可以指定命令參數選項、有的選項還可以指定實參,為了減少命令行輸入參數解析的復雜度,Laravel使用了Symfony/Component/Console/Input對象來解析命令行里這些參數選項(shell腳本里其實也是一樣,會通過shell函數getopts來解析各種格式的命令行參數輸入),同樣地Laravel使用了Symfony/Component/Console/Output對象來抽象化命令行的標準輸出。

引導應用

在Console內核的handle方法里我們可以看到和HTTP內核處理請求前使用bootstrapper程序引用應用一樣在開始處理命令任務之前也會有引導應用這一步操作

其父類 「IlluminateFoundationConsoleKernel」 內部定義了屬性名為 「bootstrappers」 的 引導程序 數組:

protected $bootstrappers = [  /Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables::class,  /Illuminate/Foundation/Bootstrap/LoadConfiguration::class,  /Illuminate/Foundation/Bootstrap/HandleExceptions::class,  /Illuminate/Foundation/Bootstrap/RegisterFacades::class,  /Illuminate/Foundation/Bootstrap/SetRequestForConsole::class,  /Illuminate/Foundation/Bootstrap/RegisterProviders::class,  /Illuminate/Foundation/Bootstrap/BootProviders::class,];

數組中包括的引導程序基本上和HTTP內核中定義的引導程序一樣, 都是應用在初始化階段要進行的環境變量、配置文件加載、注冊異常處理器、設置Console請求、注冊應用中的服務容器、Facade和啟動服務。其中設置Console請求是唯一區別于HTTP內核的一個引導程序。

執行命令

執行命令是通過Console Application來執行的,它繼承自Symfony框架的Symfony/Component/Console/Application類, 通過對應的run方法來執行命令。

name Illuminate/Foundation/Console;class Kernel implements KernelContract{  public function handle($input, $output = null)  {    try {      $this->bootstrap();      return $this->getArtisan()->run($input, $output);    } catch (Exception $e) {      $this->reportException($e);      $this->renderException($output, $e);      return 1;    } catch (Throwable $e) {      $e = new FatalThrowableError($e);      $this->reportException($e);      $this->renderException($output, $e);      return 1;    }  }}namespace Symfony/Component/Console;class Application{  //執行命令  public function run(InputInterface $input = null, OutputInterface $output = null)  {    ......    try {      $exitCode = $this->doRun($input, $output);    } catch {      ......    }    ......    return $exitCode;  }    public function doRun(InputInterface $input, OutputInterface $output)  {    //解析出命令名稱    $name = $this->getCommandName($input);        //解析出入參    if (!$name) {      $name = $this->defaultCommand;      $definition = $this->getDefinition();      $definition->setArguments(array_merge(        $definition->getArguments(),        array(          'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name),        )      ));    }    ......    try {      //通過命令名稱查找出命令類(命名空間、類名等)      $command = $this->find($name);    }    ......    //運行命令類    $exitCode = $this->doRunCommand($command, $input, $output);        return $exitCode;  }    protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)  {    ......    //執行命令類的run方法來處理任務    $exitCode = $command->run($input, $output);    ......        return $exitcode;  }}

執行命令時主要有三步操作:

  • 通過命令行輸入解析出命令名稱和參數選項。
  • 通過命令名稱查找命令類的命名空間和類名。
  • 執行命令類的run方法來完成任務處理并返回狀態碼。

和命令行腳本的規范一樣,如果執行命令任務程序成功會返回0, 拋出異常退出則返回1。

還有就是打開命令類后我們可以看到并沒有run方法,我們把處理邏輯都寫在了handle方法中,仔細查看代碼會發現run方法定義在父類中,在run方法會中會調用子類中定義的handle方法來完成任務處理。 嚴格遵循了面向對象程序設計的SOLID 原則。

結束應用

執行完命令程序返回狀態碼后, 在artisan中會直接通過exit($status)函數輸出狀態碼并結束PHP進程,接下來shell進程會根據返回的狀態碼是否為0來判斷腳本命令是否執行成功。

到這里通過命令行開啟的程序進程到這里就結束了,跟HTTP內核一樣Console內核在整個生命周期中也是負責調度,只不過Http內核最終將請求落地到了Controller程序中而Console內核則是將命令行請求落地到了Laravel中定義的各種命令類程序中,然后在命令類里面我們就可以寫其他程序一樣自由地使用Laravel中的各個組件和注冊到服務容器里的服務了。

本文已經收錄在系列文章Laravel源碼學習里,歡迎訪問閱讀。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
超碰日本道色综合久久综合| 亚洲欧洲国产一区| 日本三级韩国三级久久| 最近2019中文免费高清视频观看www99| 亚洲欧美国内爽妇网| 亚洲三级黄色在线观看| 午夜精品久久久久久久久久久久| 欧美激情免费视频| 日韩精品免费看| 欧美性黄网官网| 大荫蒂欧美视频另类xxxx| 亚洲成成品网站| 日韩美女在线看| 91精品国产91久久久久久最新| 久久精品国产视频| 日韩av快播网址| 亚洲精品www久久久| 97久久超碰福利国产精品…| 亚洲欧美日韩视频一区| 欧美精品在线免费| 久久精品国产亚洲一区二区| www国产精品com| 97在线免费观看| 国产精品色婷婷视频| 久久国产精彩视频| 国产精品吹潮在线观看| 亚洲天堂av高清| 日韩av一区在线| 亚洲一区二区三区久久| 亚洲欧美一区二区精品久久久| 久久九九免费视频| 波霸ol色综合久久| 欧美性猛交xxxx免费看| 色偷偷噜噜噜亚洲男人| 日韩av免费看网站| 在线观看欧美视频| 精品亚洲va在线va天堂资源站| 亚洲大胆美女视频| 日韩视频第一页| 欧美丝袜一区二区三区| 91精品久久久久久久久久| 日韩av大片在线| 色综合伊人色综合网站| 日韩国产在线播放| 亚洲在线视频观看| 欧美在线视频免费播放| 狠狠久久五月精品中文字幕| 成人午夜激情网| 欧美中文在线观看| 亚洲精品久久久久中文字幕二区| 91精品在线国产| 日韩美女视频在线观看| 成人xvideos免费视频| 96pao国产成视频永久免费| 久久人人97超碰精品888| 91久久久久久久一区二区| 国产欧美在线看| 国产精品久久婷婷六月丁香| 91成人天堂久久成人| 欧洲成人在线视频| 欧美国产亚洲视频| 国产精品∨欧美精品v日韩精品| 亚洲第一级黄色片| 98精品国产高清在线xxxx天堂| 色诱女教师一区二区三区| 日韩成人在线播放| 日韩av资源在线播放| 日韩在线视频免费观看| 精品少妇一区二区30p| 狠狠爱在线视频一区| 亚洲综合色av| 精品亚洲aⅴ在线观看| 日本亚洲精品在线观看| 日本不卡免费高清视频| 精品国产乱码久久久久久天美| 亚洲自拍偷拍视频| 亚洲国产精品yw在线观看| 26uuu另类亚洲欧美日本老年| 亚洲已满18点击进入在线看片| 久久韩国免费视频| 国产精品一区二区三区免费视频| 欧美小视频在线| 国语自产精品视频在线看抢先版图片| 色琪琪综合男人的天堂aⅴ视频| 欧美性一区二区三区| 久久久99久久精品女同性| 久久久久久成人精品| 亚州国产精品久久久| 欧美日本国产在线| 国产精品久久久久久一区二区| 久久久久久久色| 亚洲欧美精品在线| 97在线观看视频国产| 欧美激情啊啊啊| 国产成人精品日本亚洲| 97激碰免费视频| 国产噜噜噜噜久久久久久久久| 日本亚洲欧洲色α| 欧美国产日韩精品| 日韩欧美中文字幕在线观看| 亚洲热线99精品视频| 成人观看高清在线观看免费| 青青草一区二区| 在线播放精品一区二区三区| 亚洲人av在线影院| 欧美丝袜一区二区| 亚洲成色777777女色窝| 中文在线资源观看视频网站免费不卡| 中文国产成人精品久久一| 日韩精品有码在线观看| 国产精品电影在线观看| 日韩中文字幕视频| 亚洲国产高清自拍| 欧美成人h版在线观看| 欧美日韩精品在线播放| 在线观看欧美www| 日韩成人激情视频| 美女999久久久精品视频| 精品久久久久久中文字幕大豆网| 有码中文亚洲精品| 亚洲天堂色网站| 国产一区二区激情| 亚洲免费视频在线观看| 日韩精品视频在线免费观看| 奇门遁甲1982国语版免费观看高清| 国产欧美亚洲视频| 精品人伦一区二区三区蜜桃免费| 国产精品狼人色视频一区| 少妇av一区二区三区| 久久网福利资源网站| 91亚洲一区精品| 亚洲视频综合网| 日韩在线播放av| 高清一区二区三区日本久| 久久久久久国产| 亚洲最大中文字幕| 狠狠干狠狠久久| 欧美精品在线播放| 欧美亚洲激情在线| 欧美成人一区二区三区电影| 亚洲午夜未删减在线观看| 亚洲国产成人精品久久久国产成人一区| www国产亚洲精品久久网站| 久久精品一偷一偷国产| 成人乱色短篇合集| 亚洲自拍偷拍色图| 日韩av电影在线免费播放| 亚洲午夜未删减在线观看| 精品国产91乱高清在线观看| 欧美激情视频一区二区三区不卡| 久久国产精品影片| 国产激情久久久久| 日韩在线免费av| 亚洲视频在线观看网站| 成人精品一区二区三区电影黑人| 亚洲一区二区三区四区在线播放| 欧美日本精品在线| 欧美日韩国产一中文字不卡| 欧美巨乳在线观看| 国产丝袜精品第一页| 中文字幕在线成人| 亚洲欧美中文字幕在线一区| 一本一本久久a久久精品牛牛影视| 欧美性猛交xxxx富婆|