Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel application very slow when connecting to the database

Tags:

Note: Now that I know where the issue comes from, I modified the question. It now contains only the information needed.

I'm new to the Laravel PHP framework.

I have a very small app working on my computer. It is connected to a MySQL database and has a User model. I use the Auth class to log in and out.

Everything works fine, but when I am logged in, loading a page takes about a second which is very slow. When I'm not logged in, it's a matter of milliseconds.

By using the built-in profiler, I realized two problems. First, like I said, loading a page takes a bit more than 1000 milliseconds. Second, the framework makes one SQL every time I load a page when I'm logged in. The query searches a user with a certain id (my id). I guess it is there to get information about the logged in user. But isn't there supposed to be some sort of cache. Will this be a problem if my website will have to manage many requests per seconds.

I realized that using Auth::check() in the view is what is causing the issue. I have around 4 Auth::check() is my Blade view. When I have none, it goes fast. If I have one, it is slow. Then, no matter how many I have, it doesn't get much slower. It's like if the Auth class' initialization takes too much time or something like that. I guess it explains why it only happens when I'm logged in.

I dived into Laravel's code and I found out that when Auth::check() is called for the first time, the Auth class needs to "activate" my Session by retrieving the user's info from the database. That explains the query being executed every page request. But since the profiler says that the query doesn't even take a millisecond to execute, I still don't know why it slows down the app.

New information: Even when I'm not sending a query to the database, the simple act of connecting to it takes almost a second. This is the reason it is slow. I think I'm getting really close to solve the issue.

Any idea so far?

Thanks in advance.

Notes

  • The fact that Auth::check() is in the view doesn't change anything.
  • Using another method like Auth::guest() doesn't solve the issue.
  • New: Connecting to the database is what is slow.
like image 559
Marc-François Avatar asked Oct 11 '12 04:10

Marc-François


People also ask

Why is Laravel slow?

You can even find the laravel benchmark to be almost at the bottom. A lot of auto-loading is happening in the background, things you might not even need gets loaded. So technically because laravel is easy to use, it helps you build apps fast, it also makes it slow.

How does Laravel connect to database?

Laravel makes connecting with databases and running queries extremely simple. The database configuration file is app/config/database. php . In this file you may define all of your database connections, as well as specify which connection should be used by default.


2 Answers

I finally found a way to fix this.

When reading some posts on many forums about XAMPP, MySQL, and PHP, and I read somewhere that it is preferable to use 127.0.0.1 because locahost needs an extra DNS lookup.

In the database configuration file, I simply changed locahost for 127.0.0.1.

Now everything is fast.

I find this really strange. Using locahost in the configuration file used to make the database connection take more than a second!

like image 93
Marc-François Avatar answered Sep 20 '22 17:09

Marc-François


I do not agree with Hammo's example. Having any user information other than their ID within the session is a security risk, which is why most frameworks take this route. Is there anything else being run when the user is logged in, apart from the query for their record? It's definitely not that that's slowing your application down.

like image 35
Oddman Avatar answered Sep 16 '22 17:09

Oddman