婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談Laravel核心解讀之Console內核

淺談Laravel核心解讀之Console內核

熱門標簽:山東電銷卡外呼系統原理是什么 智能電銷語音機器人資訊 打開百度地圖標注 地圖標注怎么做商戶驗證 蘇州外呼系統有效果嗎 兼職做地圖標注好賺錢嗎 亳州企業外呼系統 400 電話 辦理 海南外呼系統方案

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源碼學習里,歡迎訪問閱讀。

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

標簽:呼倫貝爾 清遠 綏化 溫州 安康 金華 萊蕪 紹興

巨人網絡通訊聲明:本文標題《淺談Laravel核心解讀之Console內核》,本文關鍵詞  淺談,Laravel,核心,解讀,之,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談Laravel核心解讀之Console內核》相關的同類信息!
  • 本頁收集關于淺談Laravel核心解讀之Console內核的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    99久久99久久综合| 不卡av免费在线观看| 经典三级一区二区| 在线视频中文字幕一区二区| 久久嫩草精品久久久精品一| 亚洲一区二区三区激情| 国产精品一区久久久久| 在线电影国产精品| 一区二区三区欧美日韩| 99久久精品99国产精品| 亚洲午夜久久久久久久久电影网| 99国产精品久久久久久久久久久| 久久久午夜精品理论片中文字幕| 免费精品视频最新在线| 欧洲国内综合视频| 亚洲精选免费视频| 91浏览器打开| 亚洲精品乱码久久久久久黑人 | 欧美精品tushy高清| 一区二区三区在线免费播放 | 久久免费视频色| 亚洲视频电影在线| 狠狠久久亚洲欧美| 欧美日韩一区二区三区四区五区 | 精品国产髙清在线看国产毛片| 亚洲h在线观看| 欧美精品欧美精品系列| 午夜视频在线观看一区二区| 在线观看亚洲成人| 视频一区免费在线观看| 91精品中文字幕一区二区三区| 午夜欧美电影在线观看| 欧美一级淫片007| 精品在线免费观看| 久久久国产精华| 成人av在线一区二区| 亚洲精品网站在线观看| 日产国产欧美视频一区精品| 99精品视频免费在线观看| 亚洲少妇最新在线视频| 欧美日韩一区视频| 婷婷夜色潮精品综合在线| 91精品国产综合久久精品图片| 麻豆91在线播放| 中文字幕第一区综合| 欧美亚一区二区| 国内精品伊人久久久久影院对白| 国产肉丝袜一区二区| 97久久超碰国产精品| 午夜精品aaa| 国产丝袜在线精品| 欧美日韩免费一区二区三区视频| 极品瑜伽女神91| 最新国产の精品合集bt伙计| 欧美老年两性高潮| 高清不卡在线观看| 日韩精品电影在线观看| 国产精品欧美一区二区三区| 欧美一级日韩一级| 91免费版在线| 国产综合色视频| 偷拍与自拍一区| 最新成人av在线| 久久婷婷成人综合色| 99麻豆久久久国产精品免费| 亚洲成人动漫在线免费观看| 日韩情涩欧美日韩视频| 国产一区二区h| 国产成a人亚洲精| 成人91在线观看| 色婷婷av一区二区三区gif | 日本视频一区二区| 午夜在线成人av| 污片在线观看一区二区| 蜜臀av在线播放一区二区三区| 奇米888四色在线精品| 久久综合综合久久综合| 激情综合五月天| 成人手机在线视频| 色久优优欧美色久优优| 欧美日本一区二区三区| 日韩欧美色综合网站| 成人黄色片在线观看| 成人网在线播放| 国产精品系列在线观看| 国产在线播精品第三| 激情五月播播久久久精品| 成人99免费视频| 99久久精品国产毛片| 99国产精品久久久久久久久久| 北条麻妃一区二区三区| 99久久久久久99| gogogo免费视频观看亚洲一| 成人性生交大片免费看中文| 成人性色生活片免费看爆迷你毛片| 国内不卡的二区三区中文字幕| 蓝色福利精品导航| 五月综合激情网| 一区二区三区在线影院| 亚洲午夜电影网| 日本欧美在线看| 国产在线精品一区二区| 高清不卡一区二区| 97久久精品人人做人人爽50路| 91啪亚洲精品| 欧美精品久久一区二区三区| 欧美一级欧美三级在线观看| 欧美不卡一区二区三区| 国产精品区一区二区三区| 亚洲欧美电影一区二区| 综合亚洲深深色噜噜狠狠网站| wwwwww.欧美系列| 日本一区二区综合亚洲| 国产精品免费aⅴ片在线观看| 亚洲三级在线看| 亚洲成人av一区二区三区| 蜜桃久久av一区| 国产大片一区二区| 欧亚一区二区三区| 欧美sm极限捆绑bd| 亚洲国产高清aⅴ视频| 亚洲成人动漫在线免费观看| 亚洲伊人色欲综合网| 亚洲国产精品自拍| 亚洲va欧美va国产va天堂影院| 天堂资源在线中文精品| 国产欧美日韩麻豆91| 日韩一级黄色片| 久久日韩精品一区二区五区| 久久精品国产秦先生| 色哟哟在线观看一区二区三区| 3d动漫精品啪啪| 亚洲视频狠狠干| 国产麻豆精品在线| 99国产欧美另类久久久精品| 欧美伦理影视网| 国产精品私人影院| 久久91精品国产91久久小草| 欧美色网一区二区| 国产精品进线69影院| 美日韩一级片在线观看| 欧美性videosxxxxx| 亚洲国产精品传媒在线观看| 麻豆freexxxx性91精品| 欧美日韩亚洲综合| 亚洲欧美日韩一区| 国产成人免费高清| 欧美妇女性影城| 一区二区三区在线高清| 日韩av一二三| 欧美色视频在线观看| 综合电影一区二区三区| 国产成人av电影在线播放| 精品国产伦一区二区三区观看方式 | 免费日本视频一区| 欧美午夜片在线观看| 亚洲免费观看在线观看| 成人久久18免费网站麻豆 | 精品乱人伦一区二区三区| 国产在线精品一区二区三区不卡 | 精品视频1区2区| 一区二区三区.www| 欧美中文字幕久久| 一区二区三区**美女毛片| 91在线精品一区二区| 综合婷婷亚洲小说| 91日韩精品一区| 亚洲自拍偷拍综合| 欧美日韩小视频| 亚洲香肠在线观看| av福利精品导航| 中文字幕欧美一区| 99久久国产综合色|国产精品| 亚洲欧洲精品一区二区三区不卡| 99久久精品国产精品久久| 亚洲人123区| 欧美日韩一二三| 蜜臀久久99精品久久久久宅男| 91蝌蚪porny成人天涯| 欧美日韩成人一区| 秋霞午夜av一区二区三区| 欧美成人一区二区三区片免费| 狠狠色丁香久久婷婷综合丁香| 久久久久国产精品麻豆| av高清久久久| 亚洲chinese男男1069| 日韩欧美国产午夜精品| 国产精品自在在线| 亚洲日本一区二区三区| 欧美影院精品一区| 男男成人高潮片免费网站| 久久久久九九视频| 91免费小视频| 日本亚洲欧美天堂免费| 欧美一二三四区在线| 精品一区二区影视| 一区二区在线观看免费| 精品久久久久久久一区二区蜜臀| 成人永久免费视频| 日本三级韩国三级欧美三级|