摘要:然而,本文的讨论重点,还是背后的源码,是怎么做到这一步的。从哪开始看源码位于你还是可以使用编辑器搜,就可以看到源码了。第三步序列化所有路由注册映射关系,还是在的方法中上面的方法位于中的中。所以到这里,的源码解读就完成了。
学 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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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] ...
阅读 3270·2021-11-22 14:44
阅读 1115·2021-11-16 11:53
阅读 1265·2021-11-12 10:36
阅读 701·2021-10-14 09:43
阅读 3690·2019-08-30 15:55
阅读 3402·2019-08-30 14:14
阅读 1735·2019-08-26 18:37
阅读 3412·2019-08-26 12:12