laravel 路由修改不起作用解决方案

起由:今天帮朋友解决了下bug,bug就是它使用laravel时候,怎样修改路由文件,都没有发生变化,但是故意在routes.php中增加语法错误时又具有错误,因此想到了可能是这个项目使用的laravel的路由缓存,而且其路由文件中就有很多很多的路由,因此更加断定项目使用了路由缓存。

解决方案:每次在修改路由文件的时候,在项目中打开命令行,执行php artisan route:cache进行重新缓存,这样修改的路由文件才可以起作用

laravel路由缓存的优点:

  当路由定义特别多的时候,每次进行注册都非常耗时,为了达到更好的用户体验,因此需要减少这部分代码的执行时间,而路由缓存可以更好的解决此问题

laravel路由缓存的缺点:

  就像此次的bug一样,有的人可能会很难排查到这个问题,若是不考虑缓存,此问题非常之诡异。

  开启路由缓存,每次更新路由文件的时候都要再生成一次缓存

  缺点解决方案:

    当项目上线的时候,再开启此功能

参考文章:http://www.tuicool.com/articles/jUZjMj              由衷的感谢此作者分享

附文章:

  

本文译自 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 , 或者在部署脚本中来执行它.

写在最后

如果觉得路由缓存带来的性能提升还不如造成的潜在混乱和麻烦多, 你可以当这个特性不存在. 但是对于有更好的部署流程管理的团队来说, 能够这么简单就能减少每个页面半秒钟以上的加载时间, 这价值就太大了.

时间: 2025-01-07 02:50:17

laravel 路由修改不起作用解决方案的相关文章

《转》'autocomplete="off"'在Chrome中不起作用解决方案

最近项目中遇到一个令人头疼的问题,查阅各种资料,尝试各种方法,最终得以解决:哎···下面就说说这心酸的历程吧. 大家都知道autocomplete属性是表单字段中的HTML5新属性,该属性有两种状态值,分别为"on" 和 "off",该属性可省略:省略属性值后默认值为"on",也可以省略属性名,直接写入关键字on或off. 网站项目中,有登录和注册的弹框,在除chrome的浏览器中一切都ok,一旦在谷歌浏览器中,问题来了:首先从登录弹框中登陆成功

laravel路由无法访问,报404,No query results for model [App\Models\...]

今天遇到了一个问题,在routes/web.php中配置了路由,但始终无法访问该路由,一直报404. Route::resource('gift_packs', 'GiftPacksController', ['only' => ['index', 'show', 'create', 'store', 'update', 'edit', 'destroy']]); Route::get('gift_packs/test', '[email protected]')->name('gift_pa

原来 laravel 路由 参数可以为可选。。。 很灵活

基本路由 您的应用程序的绝大多数路由将在 app/routes.php 文件中定义.Laravel 中最简单的路由由一个 URI 和一个闭包调用组成. 基本 GET 路由 复制代码代码如下: Route::get('/', function(){return 'Hello World';}); 基本 POST 路由 复制代码代码如下: Route::post('foo/bar', function(){return 'Hello World';}); 注册一个路由以响应所有 HTTP 方法 复制

laravel路由基础

基础: 所有的laravel路由都定义在 app/Http/routes.php 这个文件里,会被框架自带加载.简单的路由会接受一个URI和一个Closure类. Route::get('foo', function () { return 'Hello World'; }); 默认的routes.php 是被RouteServiceProvider所加载进入框架的,允许自定义路由和响应 Route::get($uri, $callback); Route::post($uri, $callba

Android默认输入法语言的修改以及SettingsProvider作用

Android源码中默认的有三种输入法:英文,中文,日文.对应的工程代码路径为:<android_root>/packages/inputmethods/LatinIME/<android_root>/packages/inputmethods/OpenWnn/<android_root>/packages/inputmethods/PinyinIME/ 一般情况下,默认都是选择的LatinIME输入法,但是Android系统默认都是选择系统语言作为输入法,比如我们要用

Laravel路由不生效,除了首页全部404解决方案Nginx环境

原因: 请求根目录/ (http://www.xxx.com/public/),会请求public/index.php 输入其他路由地址时,会把你的请求定位到:http://www.xxx.com/index.php 里面,自然都是404 解决方案: 修改Nginx配置文件,对应域名的vhost配置文件: 增加一行:try_files $uri $uri/ /index.php?$query_string; 完美解决. Enjoy it ! 原文地址:https://www.cnblogs.co

Laravel路由和控制器的绑定

路由和控制器的关系 路由文件地址在\app\Http\routes.php,我们来看两种不同的路由. 1 2 3 4 5 6 7 8 Route::get('/', function () {     return view('welcome'); }); Route::get('/hi', function () {     return 'hello world'; }); 以上均为绑定匿名函数的路由,虽然可以返回视图,也可以返回字符串,但本质都是一样的. 1 2 Route::get('/

Laravel 路由(一)

参考:http://laravelacademy.org/post/398.html 以下代码在:laravel文件夹/app/Http/routes.php文件中更改填写 1.路由 GET 请求 格式: Route::get('请求页面',function(){ return 返回值; }); 示例: Route::get('/hello',function(){ return "Hello Laravel[GET]!"; }); 2.路由 POST 请求 格式: Route::po

laravel路由定义

参考http://www.ruchee.com/notes/fms/laravel_primer.html 路由 路由定义位置在 app/routes.php 文件,支持五种路由方法,采用回调函数的形式工作: Route::get() Route::post() Route::put() Route::delete() Route::any() 相当重要的一点:路由是区分大小写的,/hello 和 /Hello 是不同的路由 可以用 {} 对路由进行命名,如: Route::get('/hell