摘要:然而,本文的討論重點,還是背后的源碼,是怎么做到這一步的。從哪開始看源碼位于你還是可以使用編輯器搜,就可以看到源碼了。第三步序列化所有路由注冊映射關系,還是在的方法中上面的方法位于中的中。所以到這里,的源碼解讀就完成了。
學 Laravel 和 Vuejs 你真應該來 codecasts.com !
Laravel ?route:cache 可以直接緩存路由文件,這樣其實可以在一定程度上提高 Laravel 應用的性能,因為緩存路由之后,在訪問應用的時候我們就不用再次去計算路由的消耗了,可以直接根據緩存文件來進行匹配處理。
然而,本文的討論重點,還是 route:cache 背后的源碼,是怎么做到這一步的。
從哪開始看route:cache 源碼位于 IlluminateFoundationConsoleRouteCacheCommand
你還是可以使用編輯器搜 RouteCacheCommand,就可以看到源碼了。
主要的代碼邏輯就在 fire() 方法里面:
public function fire() { $this->call("route:clear"); //.... other codes }第一步
執行 $this->call("route:clear"),這部分的邏輯是:如果之前有緩存過路由文件,那么先清除舊的路由緩存,這個部分的代碼位于 IlluminateFoundationConsoleRouteClearCommand 中,還是看到 fire() 方法這里:
public function fire() { $this->files->delete($this->laravel->getCachedRoutesPath()); $this->info("Route cache cleared!"); }
主要就是執行刪除動作,將之前的緩存路由刪除;這個源碼就在 IlluminateFoundationApplication 的 getCachedRoutesPath() 中:
public function getCachedRoutesPath() { return $this->bootstrapPath()."/cache/routes.php"; }
所以這樣一看,就是刪除了 bootstrap/cache/routes.php 這個文件,那么這個文件其實就是 Laravel 的路由緩存文件,之后會重新生成這個 routes.php 文件。
第二步獲取所有的路由和其對應關系,在 RouteCacheCommand的 fire() 方法往下:
public function fire() { //... codes $routes = $this->getFreshApplicationRoutes(); //... codes }
其中的 getFreshApplicationRoutes() 的代碼是:
protected function getFreshApplicationRoutes() { return tap($this->getFreshApplication()["router"]->getRoutes(), function ($routes) { $routes->refreshNameLookups(); $routes->refreshActionLookups(); }); }
這里又包含一個新的方法 getFreshApplication() ,這個方法也是位于同樣的文件中:
protected function getFreshApplication() { return tap(require $this->laravel->bootstrapPath()."/app.php", function ($app) { $app->make(ConsoleKernelContract::class)->bootstrap(); }); }
這樣一看,總結這兩個方法做的事情就是:
getFreshApplication() 獲取一個 Laravel 的核心實例, 然后上面的 getFreshApplicationRoutes() 中的 $this->getFreshApplication()["router"]->getRoutes() 就可以理解了,也就是相當于 app("router")->getRoutes(),這個 getRoutes() 就是負責獲取所有路由,這部分的源碼位于 IlluminateRoutingRouter 的 getRoutes() 中。
第三步序列化所有路由注冊映射關系,還是在 RouteCacheCommand 的 fire() 方法中:
public function fire() { foreach ($routes as $route) { $route->prepareForSerialization(); } }
上面的 prepareForSerialization() 方法位于 IlluminateRoutingRoute 中的 prepareForSerialization() 中。
第四步序列化完成之后,將內容寫入文件中,這個文件正是一開始刪除的 bootstrap/cache/routes.php,來看代碼 RouteCacheCommand 的 fire() 方法:
$this->files->put( $this->laravel->getCachedRoutesPath(), $this->buildRouteCacheFile($routes) );
其中的 $this->laravel->getCachedRoutesPath() 在文章一開始就說明了,它是找到了 bootstrap/cache/routes.php 這個文件,然后寫入的內容就是:
protected function buildRouteCacheFile(RouteCollection $routes) { $stub = $this->files->get(__DIR__."/stubs/routes.stub"); return str_replace("{{routes}}", base64_encode(serialize($routes)), $stub); }
在這個方法中,看到 base64_encode(serialize($routes)) 這行代碼,所以你會在緩存的 routes.php 中看到類似下面的代碼:
app("router")->setRoutes( unserialize(base64_decode("TzozNDoiSWxsdW1pbm...")) );
一堆 base64 的字符串,這些字符串 base64_decode() 出來大概是這樣的:
這里就是完整的注冊路由啦!
然后在下次訪問 Laravel 項目的時候,就是可以直接從緩存的 routes 文件讀取路由了。所以到這里,route:cache 的源碼解讀就完成了。
Happy Hacking
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23135.html
摘要:為了一探究竟,于是開啟了這次應用性能調優之旅。使用即時編譯器和都能輕輕松松的讓你的應用程序在不用做任何修改的情況下,直接提高或者更高的性能。 這是一份事后的總結。在經歷了調優過程踩的很多坑之后,我們最終完善并實施了初步的性能測試方案,通過真實的測試數據歸納出了 Laravel 開發過程中的一些實踐技巧。 0x00 源起 最近有同事反饋 Laravel 寫的應用程序響應有點慢、20幾個并...
摘要:使用即時編譯器和都能輕輕松松的讓你的應用程序在不用做任何修改的情況下,直接提高或者更高的性能,之前做個一個實驗,具體請見使用提升程序性能。 本文經授權轉自 PHPHub 社區 說明 性能一直是 Laravel 框架為人詬病的一個點,所以調優 Laravel 程序算是一個必學的技能。 接下來分享一些開發的最佳實踐,還有調優技巧,大家有別的建議也歡迎留言討論。 這里是簡單的列表: 配置信...
摘要:原文來自在學習的時候,可能很多人接觸的第一個的命令就是,這樣我們就可以跑起第一個的應用。本文來嘗試解讀一下這個命令行的源碼。 原文來自:https://www.codecasts.com/blo... 在學習 Laravel 的時候,可能很多人接觸的第一個 artisan 的命令就是:php artisan serve,這樣我們就可以跑起第一個 Laravel 的應用。本文來嘗試解讀一...
摘要:用法顯示當前的幫助信息不輸出任何信息顯示當前版本強制輸出禁用輸出不進行交互運行環境詳細輸出普通更加詳細可用命令全局命令清除編譯生成的文件,相當于的反操作將站點設為維護狀態顯示當前運行環境來源于 laravel artisan 用法 $ php artisan Laravel Framework version 5.1.46 (LTS) Usage: command [options] ...
閱讀 3267·2021-11-22 14:44
閱讀 1113·2021-11-16 11:53
閱讀 1264·2021-11-12 10:36
閱讀 699·2021-10-14 09:43
閱讀 3685·2019-08-30 15:55
閱讀 3399·2019-08-30 14:14
閱讀 1734·2019-08-26 18:37
閱讀 3410·2019-08-26 12:12