连接数据库时,Laravel 应用程序非常缓慢。

20

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

我是 Laravel PHP 框架的新手。

我的电脑上有一个非常小的应用程序。它连接到 MySQL 数据库并拥有一个用户模型。我使用 Auth 类来登录和退出。

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

通过使用内置的分析器,我发现了两个问题。首先,就像我说的那样,加载页面需要多于 1000 毫秒的时间。其次,每次在已登录状态下加载页面时,框架都会执行一次 SQL 查询。该查询搜索具有特定 ID(我的 ID)的用户。我猜它是为了获取有关已登录用户的信息。但是应该有某种缓存,对吗?如果我的网站必须管理许多请求每秒,这会是一个问题吗。

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

我深入研究了 Laravel 的代码,并发现当第一次调用 Auth::check() 时,Auth 类需要通过从数据库检索用户信息来“激活”我的会话。这就解释了每个页面请求都要执行查询的原因。但是由于分析器显示查询甚至不需要一个毫秒就可以执行完,我仍然不知道为什么会导致应用程序变慢。

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

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

谢谢您的提前预祝。

注意事项

  • Auth::check() 在视图文件中出现并不影响任何情况。
  • 使用Auth::guest()等其他方法也不能解决这个问题。
  • 新的提示:连接数据库是导致速度变慢的原因。

这非常有趣。我也是 Laravel 的新手,并为我的客户完成了第一个完整的内部网络套餐。它也使用 MySQL,但看起来相当迅速。在我的系统上,速度差异并不大。你尝试过使用 Laravel 的缓存吗? - Mike Rockétt
不,我不使用任何缓存。 我期望 Auth 自己完成它,不是吗?Cache 和 Session 类都配置为使用文件系统。如果我必须手动缓存我的 Auth 变量,我该如何做到这一点? - Marc-François
好的,大部分时间不会花在身份验证上。我更关心的是缓存数据库的结果。目前来看,身份验证非常好,并且没有速度问题。 - Mike Rockétt
缓存工具不是自动的,据我所知。我还没有使用它的需要。 - Mike Rockétt
数据库查询来自于Auth。我没有使用其他任何东西。我的应用程序仍然非常简单。 - Marc-François
我明白了。你能分享一下你的看法吗? - Mike Rockétt
2个回答

40

我终于找到了解决方法。

在阅读许多有关XAMPP、MySQL和PHP的论坛帖子时,我在某个地方读到,最好使用127.0.0.1,因为localhost需要进行额外的DNS查找。

在数据库配置文件中,我只是将localhost更改为127.0.0.1

现在一切都很快。

我发现这真的很奇怪。在配置文件中使用localhost以前,数据库连接需要超过一秒钟的时间!


7
如果系统设置正确,localhost不应进行DNS查找,因为它应该位于您系统的hosts文件中。我会检查一下,这听起来像是一个不寻常的DNS设置结果。 - Adam Hopkinson
谢谢!我在Windows上使用Z-WAMP(application/config/database.php)尝试了一下,发现有明显的巨大差异! - jpmonette
@marc-francois 我对那个问题很好奇。我猜你是在Windows系统上遇到这个问题的? - dualed
2
哇!太棒了。在我正在开发的项目中,将“localhost”更改为“127.0.0.1”后,有很大的差异。当数据库配置使用“localhost”时,加载页面的时间为1,092.40毫秒。现在,经过更改,只需要58.36毫秒! - Fuhrmann
根据这个答案http://stackoverflow.com/a/16134366/905801,使用`172.0.0.1`应该比使用`localhost`慢,因为前者将建立一个TCP连接,而后者(`localhost`)将使用一个UNIX域套接字,根据这些基准测试,UNIX域套接字更快http://redis.io/topics/benchmarks。 - AbdelHady
显示剩余3条评论

2

我不同意Hammo的例子。在会话中除了用户ID之外,任何用户信息都是安全风险,这就是为什么大多数框架采用这种方式的原因。除了查询他们的记录之外,当用户登录时还有其他任何东西在运行吗?绝对不是这个导致你的应用程序变慢。


除了两三个 @if (Auth::check()) @include('some.stuff') @endif,我不知道。 - Marc-François
你是在 Blade 视图中进行身份验证检查吗?是否包含的内容可能会使其变慢? - Oddman
1
我能理解@Oddman的观点,但我不认为它适用于这种情况。那些都不需要1000毫秒才能呈现出来,虽然我不能确定。也许通过基于“LARAVEL_START”的计算来测试您的速度,并在视图中的每个相关调用之后插入一个调用,应该可以显示出问题所在。 - Mike Rockétt
很有趣的是,Auth::check() 引起了问题... 你试过 Auth::guest() 吗?但我目前在工作中,还没有查看底层代码。 - Mike Rockétt
或者,您可以通过将指令作为数组传递来在路由上运行过滤器:array('before' => 'auth'), function (x) ... - Mike Rockétt
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接