成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 淺談Laravel核心解讀之Console內(nèi)核

淺談Laravel核心解讀之Console內(nèi)核

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

Console內(nèi)核

上一篇文章我們介紹了Laravel的HTTP內(nèi)核,詳細(xì)概述了網(wǎng)絡(luò)請求從進入應(yīng)用到應(yīng)用處理完請求返回HTTP響應(yīng)整個生命周期中HTTP內(nèi)核是如何調(diào)動Laravel各個核心組件來完成任務(wù)的。除了處理HTTP請求一個健壯的應(yīng)用經(jīng)常還會需要執(zhí)行計劃任務(wù)、異步隊列這些。Laravel為了能讓應(yīng)用滿足這些場景設(shè)計了artisan工具,通過artisan工具定義各種命令來滿足非HTTP請求的各種場景,artisan命令通過Laravel的Console內(nèi)核來完成對應(yīng)用核心組件的調(diào)度來完成任務(wù)。 今天我們就來學(xué)習(xí)一下Laravel Console內(nèi)核的核心代碼。

內(nèi)核綁定

跟HTTP內(nèi)核一樣,在應(yīng)用初始化階有一個內(nèi)核綁定的過程,將Console內(nèi)核注冊到應(yīng)用的服務(wù)容器里去,還是引用上一篇文章引用過的bootstrap/app.php里的代碼

?php
// 第一部分: 創(chuàng)建應(yīng)用實例
$app = new Illuminate\Foundation\Application(
  realpath(__DIR__.'/../')
);

// 第二部分: 完成內(nèi)核綁定
$app->singleton(
  Illuminate\Contracts\Http\Kernel::class,
  App\Http\Kernel::class
);
// console內(nèi)核綁定
$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內(nèi)核 \App\Console\Kernel繼承自Illuminate\Foundation\Console, 在Console內(nèi)核中我們可以注冊artisan命令和定義應(yīng)用里要執(zhí)行的計劃任務(wù)。

/**
* 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內(nèi)核的時候,內(nèi)核會定義應(yīng)用的命令計劃任務(wù)(shedule方法中定義的計劃任務(wù))

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();
  });
}

應(yīng)用解析Console內(nèi)核

查看aritisan文件的源碼我們可以看到, 完成Console內(nèi)核綁定的綁定后,接下來就會通過服務(wù)容器解析出console內(nèi)核對象

$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);

$status = $kernel->handle(
  $input = new Symfony\Component\Console\Input\ArgvInput,
  new Symfony\Component\Console\Output\ConsoleOutput
);

執(zhí)行命令任務(wù)

解析出Console內(nèi)核對象后,接下來就要處理來自命令行的命令請求了, 我們都知道PHP是通過全局變量$_SERVER['argv']來接收所有的命令行輸入的, 和命令行里執(zhí)行shell腳本一樣(在shell腳本里可以通過$0獲取腳本文件名,$1 $2這些依次獲取后面?zhèn)鬟f給shell腳本的參數(shù)選項)索引0對應(yīng)的是腳本文件名,接下來依次是命令行里傳遞給腳本的所有參數(shù)選項,所以在命令行里通過artisan腳本執(zhí)行的命令,在artisan腳本中$_SERVER['argv']數(shù)組里索引0對應(yīng)的永遠(yuǎn)是artisan這個字符串,命令行里后面的參數(shù)會依次對應(yīng)到$_SERVER['argv']數(shù)組后續(xù)的元素里。

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

引導(dǎo)應(yīng)用

在Console內(nèi)核的handle方法里我們可以看到和HTTP內(nèi)核處理請求前使用bootstrapper程序引用應(yīng)用一樣在開始處理命令任務(wù)之前也會有引導(dǎo)應(yīng)用這一步操作

其父類 「IlluminateFoundationConsoleKernel」 內(nèi)部定義了屬性名為 「bootstrappers」 的 引導(dǎo)程序 數(shù)組:

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,
];

數(shù)組中包括的引導(dǎo)程序基本上和HTTP內(nèi)核中定義的引導(dǎo)程序一樣, 都是應(yīng)用在初始化階段要進行的環(huán)境變量、配置文件加載、注冊異常處理器、設(shè)置Console請求、注冊應(yīng)用中的服務(wù)容器、Facade和啟動服務(wù)。其中設(shè)置Console請求是唯一區(qū)別于HTTP內(nèi)核的一個引導(dǎo)程序。

執(zhí)行命令

執(zhí)行命令是通過Console Application來執(zhí)行的,它繼承自Symfony框架的Symfony\Component\Console\Application類, 通過對應(yīng)的run方法來執(zhí)行命令。

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
{
  //執(zhí)行命令
  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);
    
    //解析出入?yún)?
    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)
  {
    ......
    //執(zhí)行命令類的run方法來處理任務(wù)
    $exitCode = $command->run($input, $output);
    ......
    
    return $exitcode;
  }
}

執(zhí)行命令時主要有三步操作:

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

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

還有就是打開命令類后我們可以看到并沒有run方法,我們把處理邏輯都寫在了handle方法中,仔細(xì)查看代碼會發(fā)現(xiàn)run方法定義在父類中,在run方法會中會調(diào)用子類中定義的handle方法來完成任務(wù)處理。 嚴(yán)格遵循了面向?qū)ο蟪绦蛟O(shè)計的SOLID 原則。

結(jié)束應(yīng)用

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

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

本文已經(jīng)收錄在系列文章Laravel源碼學(xué)習(xí)里,歡迎訪問閱讀。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:呼倫貝爾 清遠(yuǎn) 綏化 溫州 安康 金華 萊蕪 紹興

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Laravel核心解讀之Console內(nèi)核》,本文關(guān)鍵詞  淺談,Laravel,核心,解讀,之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Laravel核心解讀之Console內(nèi)核》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談Laravel核心解讀之Console內(nèi)核的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲天堂av网站| 免费羞羞视频| av在线二区| 久久久噜噜噜久噜久久| 欧美性猛交xxxx免费看久久| 999在线观看| 久久国产综合视频| 亚洲精品一区二| 亚洲小说欧美另类激情| 国产日韩一区二区三免费高清| 久久久久久中文| 国产美女精品视频免费播放软件| 久久99精品国产99久久6尤物| 又色又爽又高潮免费视频国产| 国产一区二区免费在线观看| 日本蜜桃在线观看| 亚洲精品国产精| 在线免费观看不卡av| 在线观看中文字幕av| 日日噜噜夜夜狠狠久久波多野| 尤物视频在线免费观看| 大地资源网在线观看免费官网| 国产视频一区二区三区在线观看| 国产精品三级a三级三级午夜| 亚洲av综合色区无码一区爱av| 日日草天天干| 中文字幕高清一区| 亚洲欧美日韩精品综合在线观看| wwww国产精品欧美| 超碰在线caoporen| 黄网站色视频免费观看| 欧美亚洲丝袜| 免费看成年人视频在线观看| 最近免费中文字幕视频2019| 日韩视频在线播放| 欧洲av一区二区| 亚洲视频在线观看| av网站免费观看| 中文字幕视频一区| 99久久久国产精品美女| 国产亚洲一二三区| 亚洲制服丝袜一区| 久久91精品国产91久久小草| 国产欧美 在线欧美| 老司机福利在线视频| 欧美精品一区二区三| 美女被搞网站| 色妞色视频一区二区三区四区| 美女不穿衣服的网站| 77777少妇光屁股久久一区| 精品乱子伦一区二区| 影音先锋欧美在线| 99re5久久在热线播放| 日本高清不卡码| 亚洲va在线va天堂va偷拍| 美洲精品一卡2卡三卡4卡四卡| 亚洲欧美日韩中文视频| 日韩精品综合一本久道在线视频| 国自产拍在线网站网址视频| 精品视频一区二区三区四区| 久久久精品国产sm调教网站| 91丨国产丨九色丨pron| 在线不卡国产精品| 国产十六处破外女视频| 国产欧美一区在线| 国产www视频| 美女啪啪无遮挡免费久久网站| 日本韩国欧美在线| 国产日本欧美一区二区三区| 亚洲性生活网站| 中文字幕免费高清电视剧网站在线观看| 欧美在线免费观看视频| 热久久免费视频| 国产亚洲欧美日韩在线观看一区二区| 久久国产精品久久| 米奇精品一区二区三区| 九九这里只精品视在线99| 99久久婷婷国产精品综合| 国产在线视频卡一卡二| 欧美在线影院一区二区| 国产精品久久久久久久久久免费看| a级日韩大片| 国产探花在线看| japanese中文字幕| 伊人色在线观看| 色综合一区二区日本韩国亚洲| 天堂av8在线| 国产福利一区二区三区在线视频| 国产3p在线播放| 亚洲一区二区自拍偷拍| 久久久综合亚洲91久久98| 91麻豆精品国产综合久久久久久| 国产在线第一页| 成人黄色91| 国产精品久久久久久久成人午夜| 亚洲综合网在线| 3d动漫精品啪啪一区二区竹菊| 国产农村妇女毛片精品久久莱园子| 亚洲人被黑人高潮完整版| 中文字幕丰满孑伦无码专区| 中文人妻一区二区三区| 欧美男男video| 另类少妇人与禽zozz0性伦| 中文字幕日韩一区二区| 色88久久久久高潮综合影院| 日本成人伦理电影| 国产精品996| 久久频这里精品99香蕉| 国产一二区视频| 91精品麻豆日日躁夜夜躁| 国产成人看片| 国产伦一区二区| 国产.com| 美女又黄又免费的视频| 一个人www视频在线免费观看| 91麻豆一二三四在线| 91精品国产全国免费观看| 亚洲欧洲日产国产网站| 欧美一区二区三区视频在线观看| 日韩黄色av| 97精品久久人人爽人人爽| 欧美日韩久久久一区| 亚洲精品久久7777777| 欧美天堂影院| 日本免费高清不卡| 亚洲依依成人| 91免费精品国偷自产在线在线| 色综合91久久精品中文字幕| 麻豆成人久久精品二区三区红| 国产精品妹子av| 久草免费在线视频| 欧美精品第一页在线播放| 国产精品久久久久久av福利| 精品国产乱码久久久久久蜜臀网站| 日韩高清二区| 欧美日韩一级片在线观看| av欧美精品.com| 视频在线观看一区| 亚洲精品进入| 黑人极品videos精品欧美裸| 久久一级大片| 在线视频综合导航| 精品国产乱码久久久久久1区2区| 男女激情免费视频| 国产亚洲精品美女| 三上悠亚一区二区三区| 97欧美精品一区二区三区| 日本国产中文字幕| 亚洲 欧美 激情 另类| 日韩中文字幕第一页| 欧美精品中文字幕亚洲专区| 东京热一区二区三区四区| 国产精久久久久久| 男女午夜激情视频| 两根大肉大捧一进一出好爽视频| 九七电影院97理论片久久tvb| 国产精品国产福利国产秒拍| 91 在线视频| 天天干天天爽天天操| 欧美精品二区| 国产精品久久久久野外| 极品一区美女高清| 国产精品国产自产拍高清av王其| 性欧美xxx69hd高清| 亚洲欧美另类久久久精品| 偷拍自拍一区| 日本精品视频一区二区三区| 精品裸体舞一区二区三区| 国产成人免费9x9x人网站视频| 日韩国产精品久久久| 国产在线视频自拍| 国产伦精品一区二区三区千人斩| 8050国产精品久久久久久| 日日夜夜中文字幕| 欧美三级蜜桃2在线观看| 另类视频在线观看| 成人免费高清观看| 91精品国产91综合久久蜜臀| 国产一区香蕉久久| 污污网站在线免费观看| av男人一区| 国产大屁股喷水视频在线观看| 亚洲图片88| 亚洲第一天堂在线观看| 国产一区二区三区久久久| 在线日韩电影| 国产精品日韩电影| 中文在线天堂网www| 久久久久久国产精品mv| 在线免费观看你懂的| 午夜爽爽视频| 久久不见久久见国语| 亚洲搞黄视频| 国产精品久久久久久久久动漫| 能免费看av的网站| 老司机2019福利精品视频导航| 日本女优天堂99伊人| 日韩一级在线免费观看| 日韩精品一二三四| 佐山爱痴汉视频一区二区三区| 麻豆影院在线观看| 群体交乱之放荡娇妻一区二区| 国产精品作爱| 免费精品一区| 在线视频欧美日韩| 色一情一乱一伦一区二区三区| 欧美综合色免费| 先锋影音在av资源看片| 高清无码视频直接看| 曰本一区二区| 久久国产精品高清一区二区三区| 色琪琪综合男人的天堂aⅴ视频| 久久精品亚洲牛牛影视| 精品国产三区在线| 亚洲精品一区二区三区蜜桃下载| 99久久er热在这里只有精品15| 午夜一区二区视频| 久久久加勒比| 亚洲三级在线观看视频| 精品国产无码一区二区| 日本在线视频站| 日韩综合视频在线观看| jizzyou欧美16| 欧美一区日韩一区| 久久国产精品波多野结衣av| 中文字幕欧美日韩久久| 日本免费黄色小视频| 加勒比在线一区二区三区观看| 天堂а√在线8种子蜜桃视频| 欧美一区二区三区喷汁尤物| 国产91视频在线| a毛片在线看免费观看| 亚洲人免费短视频| 亚洲av无码一区东京热久久| 2018中文字幕第一页| 亚洲激情图片| 成人激情视频在线播放| 高清国产一区二区三区| 992tv国产精品成人影院| 日韩电影在线一区二区三区| 精品国产伦一区二区三区观看说明| 亚洲高清av一区二区三区| 永久久久免费浮力影院| 黄色精品在线看| 成人区精品一区二区| 麻豆成人在线播放| 激情校园亚洲图片| 97人人澡人人爽91综合色| 亚洲成精国产精品女| 一出一进一爽一粗一大视频| 天天干天天操天天操| 国产一区清纯| 久久久久久久久亚洲精品| 亚洲人成毛片在线播放女女| 久久精品女人| 亚洲成人中文| 精品人妻伦一区二区三区久久| 中文在线不卡| 91精品国产自产在线观看永久∴| 婷婷精品进入| 亚洲国产美女搞黄色| 国产美女娇喘av呻吟久久| 18国产免费视频| 成人福利一区二区| 欧美激情喷水| 精品人妻一区二区免费视频| 99久久免费国产精品| 久久久电影一区二区三区| 国产精品影片在线观看| 男女羞羞免费视频| 欧美激情第二页| 一级片免费在线观看视频| 九色国产蝌蚪| 成人午夜激情网| 国产一级一级片| 亚洲免费伊人电影在线观看av| 国产伦精品一区二区三区在线观看| 青青草成人免费在线视频| 18禁裸男晨勃露j毛免费观看| 欧美日韩一本到| 国产精品丝袜白浆摸在线| 福利电影在线| 日韩黄色高清视频| av免费看网址| 久久综合色鬼综合色| 亚洲另类xxxx| 精品国产不卡一区二区三区| 日韩一级高清毛片| 第一区免费在线观看| 日本黄色中文字幕| 久久国产精品亚洲va麻豆| 日韩欧美二区三区| 国产精品日韩一区二区| 免费在线观看黄色网| 俄罗斯精品一区二区| 粉嫩aⅴ一区二区三区四区| 欧美日韩欧美| 国产精品亚洲аv天堂网| 视频一区二区三区四区五区| 成人国产精品免费观看动漫| 日韩精品高清视频| 国内精品视频一区二区三区| 天堂av在线电影| 欧美精品韩国精品| 成年人在线看片| 91大神在线资源观看无广告| 亚洲黄色免费在线观看| 欧美一级免费在线| 日韩精品免费一区二区三区竹菊| 在线天堂视频| 精产国品一区二区三区| 九九热播视频在线精品6| 日韩偷拍自拍| 成人丝袜视频网| 色就是色亚洲色图| 国产伦精品一区二区三区高清| 国产毛片精品视频| 欧美韩日一区二区| 国产精品美女久久久久人| 毛片在线免费视频| 国产欧美日韩伦理| 欧美成a人片免费观看久久五月天| 裸体素人女欧美日韩| 国产高清视频免费最新在线| 国产伦一区二区| 欧美性xxxxxxx| 日本高清网站| 中文字幕在线一区二区三区|