【问题标题】:Laravel dynamic routing performance issueLaravel 动态路由性能问题
【发布时间】:2016-02-23 17:37:12
【问题描述】:

我想知道通过数据库动态加载路由是否存在任何性能问题。

routes.php 中,它将从数据库中检索值并从那里创建路由。

来自routes.php

buildDynamicRoutes(new App\Factory\ModelFactory('App\Models\RoutingModel'));

function buildDynamicRoutes($model)
{
    $routes = $model->getInstance()->getRoutes(); // 'routes' is the table name wherein routes will be stored.
    if (is_array($routes) && !empty($routes)) {
        foreach ($routes as $route) {
            Route::resource($route['url'], 'DynamicController');
        }
    }
}

所以基本上,在buildDynamicRoutes 方法上,它将调用实例化RoutingModel 类的ModelFactory。一旦实例化,它将通过getRoutes() 方法连接到API,该方法将返回路由结果。

从那里,它将基于返回的$route['url'] 构建Route::resource,它将使用DynamicController

具有这种结构,在路由或加载网络应用程序方面是否会出现任何性能问题?我之所以问这个问题是因为我注意到我的网络应用加载速度似乎很慢,页面加载时间大约为 10-18 秒。

我最近从 Codeigniter 升级到了 Laravel 5.2,并注意到在切换到 Laravel 时出现了严重的性能问题。当我之前使用 Codeigniter 时,页面仅在大约 2-4 秒内加载。请注意它带来的巨大差异。

同样的逻辑,只是根据 Laravel 的标准重新编写代码。

【问题讨论】:

  • Codeigniter 比 laravel 快
  • 我在 Laravel 中从未见过这样的事情。通常路由是静态的,然后通过路由缓存机制进行缓存。另外,试试 Lumen,它有更快的路由器。
  • 尝试使用路由缓存(我不知道它是否适用于您的示例)但如果可以,请不要忘记在每次创建新路由时重新缓存路由@987654332 @
  • 对于初学者来说,2-4 秒对于TTFB 来说是很多,所以你的 CodeIgniter 性能一开始就不好。除此之外,您应该更详细地解释您要实现的目标:为什么需要从数据库中加载路由,数据库中存储了多少路由等。了解更多细节将有助于我们提出一个很好的实施。
  • 有一件事从一开始就很突出:您不应该在每个请求上生成路由定义。 @ahmad 关于缓存路线的建议非常好。您可以查看this answer,它展示了如何仅在需要时才以编程方式构建和缓存路由,而不是在每个请求时。

标签: php codeigniter laravel laravel-routing laravel-5.2


【解决方案1】:

试试这个,让我们知道它是怎么回事。

 $routes = Cache::has('routes')
               ? Cache::get('routes')
               : $model->getInstance()->getRoutes();
 if (!Cache::has('routes')) {
    Cache::add('routes', $routes, 120); 
 }

替换为您的“$routes = $model->getInstance()->getRoutes()”分配。也许你需要导入缓存:

use Illuminate\Support\Facades\Cache;

如果您的 $routes 值经常更改,您可以设置另一个缓存时间而不是 120 分钟。

【讨论】:

  • 谢谢。我想知道拥有此代码与执行此命令有什么区别:php artisan route:cache?另外,在运行这个命令时,我遇到了一个错误[Symfony\Component\Debug\Exception\FatalErrorException] Cannot redeclare buildDynamicRoutes() (previously declared ...)除了在路由文件中没有声明这个方法的地方,这很奇怪为什么它只声明一次时将它视为重复方法。跨度>
  • 不确定。我认为当您的路线没有太多变化时,工匠命令会更好。
  • 为避免重新声明错误,您可以在 if (! function_exists('buildDynamicRoutes')) 语句中包含函数声明。
  • 这成功了!非常感谢!我想知道为什么会这样?也许是一个错误?
  • 如果我运行php artisan route:cache 命令,上面的代码还需要吗?还是会多余?
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2014-08-14
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多