本文译自 Matt Stauffer 的 系列文章 .
在 PHP 代码中进行性能优化并非总是我们优先考虑的问题. 但是我们对后端代码的性能优化--特别是在一些很复杂的操作上--可以对网站的请求时间产生几十甚至几百毫秒的影响. 看上去不算很多, 但是 几百毫秒的差异对于你的应用的用户感知速度来说可能意味着巨大的差异 (链接可能需要扶墙访问).
你可能没有注意到, 在 Laravel 4 以及更老版本中, 路由逻辑是性能上的一个瓶颈--特别是对于有很多路由定义的应用而言. 一个只有几百条路由定义的 Laravel 站点, 框架光注册路由就需要半秒多的时间. 不过以后不用担心这个问题了, 因为 Laravel 5 引入了 路由缓存(route caching) , 可以大大优化路由的性能(闭包方式定义的路由不能缓存, 所以该把所有的闭包路由定义都移到控制器中了).
使用路由缓存
老实说, 使用路由缓存很简单. 有一个新的 Artisan 命令 route:cache
可以把 routes.php
文件中的所有路由定义序列化 -- 会对所有的路由进行一次解析然后把解析结果缓存起来. 如果你曾经用过 Handlebars 模板的预编译的话, Laravel 5 的路由缓存机制跟它有点类似.
这样就已经搞定了. 执行完这个命令以后, 所有的路由都是从缓存文件而不是路由文件进行读取. 之后你可以对 routes.php 的随意进行修改, 但应用的路由不会发生变化, 一直到再次执行 route:cache
重新缓存.
优点和缺点
优点很明显: 网站的速度会更快.
但缺点也不得不提: 只要缓存过一次网站的路由定义, 以后每次对 routes.php
文件进行修改都需要重新执行缓存操作, 否则修改不会生效. 这可能会造成部分开发者的疑惑, 有可能你可能怎么修改 routes.php
都没用, 偏偏一时没想到是路由缓存造成的.
幸亏有两个方法可以解决这个问题. 第一种方法: 可以执行 artisan route:clear
, 这样 artisan 会删除路由缓存. 第二种方法: 可以考虑只在正式环境使用路由缓存. 然后在 Git 的 post-deploy 钩子中执行 artisan route:cache
, 或者在部署脚本中来执行它.
写在最后
如果觉得路由缓存带来的性能提升还不如造成的潜在混乱和麻烦多, 你可以当这个特性不存在. 但是对于有更好的部署流程管理的团队来说, 能够这么简单就能减少每个页面半秒钟以上的加载时间, 这价值就太大了.