亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

源碼解讀:Laravel php artisan route:cache

wangzy2019 / 2882人閱讀

摘要:然而,本文的討論重點(diǎn),還是背后的源碼,是怎么做到這一步的。從哪開(kāi)始看源碼位于你還是可以使用編輯器搜,就可以看到源碼了。第三步序列化所有路由注冊(cè)映射關(guān)系,還是在的方法中上面的方法位于中的中。所以到這里,的源碼解讀就完成了。

學(xué) Laravel 和 Vuejs 你真應(yīng)該來(lái) codecasts.com !

Laravel ?route:cache 可以直接緩存路由文件,這樣其實(shí)可以在一定程度上提高 Laravel 應(yīng)用的性能,因?yàn)榫彺媛酚芍?,在訪問(wèn)應(yīng)用的時(shí)候我們就不用再次去計(jì)算路由的消耗了,可以直接根據(jù)緩存文件來(lái)進(jìn)行匹配處理。

然而,本文的討論重點(diǎn),還是 route:cache 背后的源碼,是怎么做到這一步的。

從哪開(kāi)始看

route:cache 源碼位于 IlluminateFoundationConsoleRouteCacheCommand

你還是可以使用編輯器搜 RouteCacheCommand,就可以看到源碼了。
主要的代碼邏輯就在 fire() 方法里面:

 public function fire()
    {
        $this->call("route:clear");
        //.... other codes
    }
第一步

執(zhí)行 $this->call("route:clear"),這部分的邏輯是:如果之前有緩存過(guò)路由文件,那么先清除舊的路由緩存,這個(gè)部分的代碼位于 IlluminateFoundationConsoleRouteClearCommand 中,還是看到 fire() 方法這里:

 public function fire()
    {
        $this->files->delete($this->laravel->getCachedRoutesPath());

        $this->info("Route cache cleared!");
    }

主要就是執(zhí)行刪除動(dòng)作,將之前的緩存路由刪除;這個(gè)源碼就在 IlluminateFoundationApplicationgetCachedRoutesPath() 中:

 public function getCachedRoutesPath()
    {
        return $this->bootstrapPath()."/cache/routes.php";
    }

所以這樣一看,就是刪除了 bootstrap/cache/routes.php 這個(gè)文件,那么這個(gè)文件其實(shí)就是 Laravel 的路由緩存文件,之后會(huì)重新生成這個(gè) routes.php 文件。

第二步

獲取所有的路由和其對(duì)應(yīng)關(guān)系,在 RouteCacheCommandfire() 方法往下:

public function fire()
    {
      //... codes
      $routes = $this->getFreshApplicationRoutes();
      //... codes
    }

其中的 getFreshApplicationRoutes() 的代碼是:

protected function getFreshApplicationRoutes()
    {
        return tap($this->getFreshApplication()["router"]->getRoutes(), function ($routes) {
            $routes->refreshNameLookups();
            $routes->refreshActionLookups();
        });
    }

這里又包含一個(gè)新的方法 getFreshApplication() ,這個(gè)方法也是位于同樣的文件中:

protected function getFreshApplication()
    {
        return tap(require $this->laravel->bootstrapPath()."/app.php", function ($app) {
            $app->make(ConsoleKernelContract::class)->bootstrap();
        });
    }

這樣一看,總結(jié)這兩個(gè)方法做的事情就是:

getFreshApplication() 獲取一個(gè) Laravel 的核心實(shí)例, 然后上面的 getFreshApplicationRoutes() 中的 $this->getFreshApplication()["router"]->getRoutes() 就可以理解了,也就是相當(dāng)于 app("router")->getRoutes(),這個(gè) getRoutes() 就是負(fù)責(zé)獲取所有路由,這部分的源碼位于 IlluminateRoutingRoutergetRoutes() 中。

第三步

序列化所有路由注冊(cè)映射關(guān)系,還是在 RouteCacheCommandfire() 方法中:

public function fire()
{
   foreach ($routes as $route) {
        $route->prepareForSerialization();
    }
}

上面的 prepareForSerialization() 方法位于 IlluminateRoutingRoute 中的 prepareForSerialization() 中。

第四步

序列化完成之后,將內(nèi)容寫(xiě)入文件中,這個(gè)文件正是一開(kāi)始刪除的 bootstrap/cache/routes.php,來(lái)看代碼 RouteCacheCommandfire() 方法:

 $this->files->put(
    $this->laravel->getCachedRoutesPath(), 
    $this->buildRouteCacheFile($routes)
 );

其中的 $this->laravel->getCachedRoutesPath() 在文章一開(kāi)始就說(shuō)明了,它是找到了 bootstrap/cache/routes.php 這個(gè)文件,然后寫(xiě)入的內(nèi)容就是:

protected function buildRouteCacheFile(RouteCollection $routes)
    {
        $stub = $this->files->get(__DIR__."/stubs/routes.stub");

        return str_replace("{{routes}}", base64_encode(serialize($routes)), $stub);
    }

在這個(gè)方法中,看到 base64_encode(serialize($routes)) 這行代碼,所以你會(huì)在緩存的 routes.php 中看到類(lèi)似下面的代碼:

app("router")->setRoutes(
    unserialize(base64_decode("TzozNDoiSWxsdW1pbm..."))
);

一堆 base64 的字符串,這些字符串 base64_decode() 出來(lái)大概是這樣的:

這里就是完整的注冊(cè)路由啦!

然后在下次訪問(wèn) Laravel 項(xiàng)目的時(shí)候,就是可以直接從緩存的 routes 文件讀取路由了。所以到這里,route:cache 的源碼解讀就完成了。

Happy Hacking

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/23135.html

相關(guān)文章

  • 記一次 Laravel 應(yīng)用性能調(diào)優(yōu)經(jīng)歷

    摘要:為了一探究竟,于是開(kāi)啟了這次應(yīng)用性能調(diào)優(yōu)之旅。使用即時(shí)編譯器和都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高或者更高的性能。 這是一份事后的總結(jié)。在經(jīng)歷了調(diào)優(yōu)過(guò)程踩的很多坑之后,我們最終完善并實(shí)施了初步的性能測(cè)試方案,通過(guò)真實(shí)的測(cè)試數(shù)據(jù)歸納出了 Laravel 開(kāi)發(fā)過(guò)程中的一些實(shí)踐技巧。 0x00 源起 最近有同事反饋 Laravel 寫(xiě)的應(yīng)用程序響應(yīng)有點(diǎn)慢、20幾個(gè)并...

    warkiz 評(píng)論0 收藏0
  • laravel入門(mén)

    摘要:開(kāi)發(fā)根目錄測(cè)試分為單元測(cè)試和功能測(cè)試創(chuàng)建一個(gè)文件執(zhí)行測(cè)試測(cè)試前清除配置緩存運(yùn)行單個(gè)測(cè)試用例小提示在開(kāi)發(fā)與進(jìn)行交互的第三方擴(kuò)展包時(shí),最好選擇注入契約而不使用。 參考https://laravelacademy.org/ 概念 單詞 契約Contract 就是接口 repository 倉(cāng)庫(kù)(封裝數(shù)據(jù)訪問(wèn),可以搜索:repository模式) Container 容器 ServicePr...

    韓冰 評(píng)論0 收藏0
  • Laravel 5 程序優(yōu)化技巧

    摘要:使用即時(shí)編譯器和都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高或者更高的性能,之前做個(gè)一個(gè)實(shí)驗(yàn),具體請(qǐng)見(jiàn)使用提升程序性能。 本文經(jīng)授權(quán)轉(zhuǎn)自 PHPHub 社區(qū) 說(shuō)明 性能一直是 Laravel 框架為人詬病的一個(gè)點(diǎn),所以調(diào)優(yōu) Laravel 程序算是一個(gè)必學(xué)的技能。 接下來(lái)分享一些開(kāi)發(fā)的最佳實(shí)踐,還有調(diào)優(yōu)技巧,大家有別的建議也歡迎留言討論。 這里是簡(jiǎn)單的列表: 配置信...

    habren 評(píng)論0 收藏0
  • 源碼解讀php artisan serve

    摘要:原文來(lái)自在學(xué)習(xí)的時(shí)候,可能很多人接觸的第一個(gè)的命令就是,這樣我們就可以跑起第一個(gè)的應(yīng)用。本文來(lái)嘗試解讀一下這個(gè)命令行的源碼。 原文來(lái)自:https://www.codecasts.com/blo... 在學(xué)習(xí) Laravel 的時(shí)候,可能很多人接觸的第一個(gè) artisan 的命令就是:php artisan serve,這樣我們就可以跑起第一個(gè) Laravel 的應(yīng)用。本文來(lái)嘗試解讀一...

    Loong_T 評(píng)論0 收藏0
  • laravel artisan

    摘要:用法顯示當(dāng)前的幫助信息不輸出任何信息顯示當(dāng)前版本強(qiáng)制輸出禁用輸出不進(jìn)行交互運(yùn)行環(huán)境詳細(xì)輸出普通更加詳細(xì)可用命令全局命令清除編譯生成的文件,相當(dāng)于的反操作將站點(diǎn)設(shè)為維護(hù)狀態(tài)顯示當(dāng)前運(yùn)行環(huán)境來(lái)源于 laravel artisan 用法 $ php artisan Laravel Framework version 5.1.46 (LTS) Usage: command [options] ...

    Betta 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<