【问题标题】:Laravel application very slow when connecting to the databaseLaravel 应用程序连接数据库时速度很慢
【发布时间】:2012-10-11 04:27:04
【问题描述】:

注意:现在我知道问题出在哪里,我修改了问题。它现在只包含所需的信息。

我是 Laravel PHP 框架的新手。

我的电脑上有一个非常小的应用程序。它连接到 MySQL 数据库并具有 User 模型。我使用 Auth 类登录和注销。

一切正常,但是当我登录时,加载页面大约需要一秒钟,这非常慢。当我没有登录时,这只是几毫秒的问题。

通过使用内置分析器,我发现了两个问题。首先,就像我说的,加载一个页面需要超过 1000 毫秒。其次,当我登录时,每次加载页面时,该框架都会生成一个 SQL。该查询搜索具有特定 id(我的 id)的用户。我想它可以获取有关登录用户的信息。但是不应该有某种缓存。如果我的网站每秒必须管理许多请求,这会是一个问题吗?

我意识到在视图中使用 Auth::check() 是导致问题的原因。我有大约 4 个 Auth::check() 是我的 Blade 视图。当我没有时,它会很快。如果我有,它会很慢。然后,无论我有多少,它都不会变慢。就像 Auth 类的初始化需要太多时间或类似的东西。我想它解释了为什么它只在我登录时才会发生。

我深入研究了 Laravel 的代码,发现当第一次调用 Auth::check() 时,Auth 类需要通过从数据库中检索用户信息来“激活”我的 Session。这解释了每个页面请求都执行的查询。但是由于分析器说查询甚至不需要一毫秒的时间来执行,我仍然不知道为什么它会减慢应用程序的速度。

新信息:即使我没有向数据库发送查询,连接到它的简单动作也几乎需要一秒钟。这就是它慢的原因。我想我已经非常接近解决这个问题了。

到目前为止有什么想法吗?

提前致谢。

注意事项

  • Auth::check() 在视图中这一事实不会改变任何事情。
  • 使用 Auth::guest() 等其他方法无法解决问题。
  • 新功能:连接到数据库很慢。

【问题讨论】:

  • 这很有趣。我也是 Laravel 的新手,并且已经为我的客户完成了我的第一个完整的 Intranet 包。它也使用 MySQL,但看起来相当快。我的系统上的速度差异并不大。你试过使用 Lavarel 的缓存了吗?
  • 不,我不使用任何缓存。我希望 Auth 自己做,不是吗? Cache 和 Session 类都配置为使用文件系统。如果我必须手动缓存我的 Auth 变量,我该怎么做?
  • 好吧,大部分时间都不是 Auth。我更关心缓存数据库的结果。就目前而言,Auth 相当不错,而且没有速度问题。
  • 据我所知,缓存工具不是自动的。还没有用过。
  • 数据库查询来自 Auth。我不使用其他任何东西。我的应用还是很简单的。

标签: php laravel


【解决方案1】:

我终于找到了解决这个问题的方法。

在许多论坛上阅读有关 XAMPP、MySQL 和 PHP 的一些帖子时,我在某处读到最好使用 127.0.0.1,因为 locahost 需要额外的DNS 查找。

在数据库配置文件中,我只是简单地将locahost改成了127.0.0.1

现在一切都很快。

我觉得这很奇怪。在配置文件中使用 locahost 使数据库连接耗时超过一秒!

【讨论】:

  • 我想知道还有谁可能遇到同样的问题。看,就像我在上一条评论中所说的那样,我的查询平均不到一秒,并且我使用主机名查找。事实上,我有一个拥有大量本地域的域管理器。然而,我还没有尝试回到 IP...
  • 如果系统设置正确,应该没有对localhost的dns查找,因为它应该在系统上的hosts文件中。我会检查一下 - 这听起来像是不寻常的 dns 设置的结果
  • 谢谢!我在 Windows 上使用 Z-WAMP (application/config/database.php) 进行了尝试,并且有一个巨大的明显差异!
  • @marc-francois 我很好奇这个问题。我假设您在 Windows 系统上遇到过这种情况?
  • 哇!惊人的。将“localhost”更改为“127.0.0.1”后,我正在开发的项目有很大的不同。当数据库配置使用“localhost”时,加载页面的时间为 1,092.40 毫秒。现在,更改后是 58.36ms!
【解决方案2】:

我不同意 Hammo 的例子。在会话中包含除 ID 之外的任何用户信息都是一种安全风险,这就是大多数框架采用这种方式的原因。当用户登录时,除了查询他们的记录之外,是否还有其他运行?绝对不是这会拖慢您的应用程序速度。

【讨论】:

  • 嗯,除了两三个@if (Auth::check()) @include('some.stuff') @endif,我不知道。
  • 您是否在刀片视图中进行身份验证检查?包含可能会减慢速度吗?
  • 是的,Auth 检查是在 Blade 视图中完成的。 @include 用于一个简单的菜单和一些我想显示或隐藏的链接。
  • 我可以看到@Oddman 的来源,但我认为它不适用于这种情况。所有这些都不会花费近 1000 毫秒的时间来渲染,尽管我无法确定这一点。也许通过基于LARAVEL_START 进行计算来测试您的速度,并在您视图中的每个相关调用之后插入一个调用应该告诉您出了什么问题。
  • 感谢迈克尔的想法。现在,我找到了有关该问题的更多信息。我用这些信息编辑了问题。
猜你喜欢
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2022-11-19
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多