Приложение Laravel очень медленное при подключении к базе данных

Примечание. Теперь, когда я знаю, откуда взялась проблема, я изменил вопрос. Теперь он содержит только необходимую информацию.

Я новичок в PHP-фреймворке Laravel.

У меня на компьютере работает очень маленькое приложение. Он подключен к базе данных MySQL и имеет модель User. Я использую класс Auth для входа и выхода.

Все работает нормально, но когда я вхожу в систему, загрузка страницы занимает около секунды, что очень медленно. Когда я не авторизован, это вопрос миллисекунд.

Используя встроенный профилировщик, я решил две проблемы. Во-первых, как я уже сказал, загрузка страницы занимает чуть больше 1000 миллисекунд. Во-вторых, фреймворк выполняет один SQL каждый раз, когда я загружаю страницу, когда я вхожу в систему. Запрос выполняет поиск пользователя с определенным идентификатором (моим идентификатором). Я предполагаю, что это нужно для получения информации о вошедшем в систему пользователе. Но разве там не должно быть какого-то кеша. Будет ли это проблемой, если моему сайту придется обрабатывать много запросов в секунду.

Я понял, что использование Auth::check() в представлении является причиной проблемы. У меня около 4 Auth::check() это мой Blade view. Когда у меня его нет, все идет быстро. Если есть, то медленно. Тогда, сколько бы у меня ни было, это не станет намного медленнее. Это как если инициализация класса Auth занимает слишком много времени или что-то в этом роде. Думаю, это объясняет, почему это происходит только тогда, когда я вхожу в систему.

Я погрузился в код Laravel и обнаружил, что когда Auth::check() вызывается в первый раз, класс Auth должен «активировать» мой сеанс, извлекая информацию о пользователе из базы данных. Это объясняет, что запрос выполняется при каждом запросе страницы. Но поскольку профилировщик говорит, что для выполнения запроса не требуется даже миллисекунды, я до сих пор не знаю, почему он замедляет работу приложения.

Новая информация: даже когда я не отправляю запрос к базе данных, простое подключение к ней занимает почти секунду. Это причина того, что он медленный. Думаю, я очень близок к решению проблемы.

Есть идеи на данный момент?

Заранее спасибо.

Примечания

  • Тот факт, что Auth::check() находится в поле зрения, ничего не меняет.
  • Использование другого метода, например Auth::guest(), не решает проблему.
  • Новое: подключение к базе данных происходит медленно.

person Marc-François    schedule 11.10.2012    source источник
comment
Это довольно интересно. Я также новичок в Laravel и завершил свой первый полный пакет интранет для своих клиентов. Он также использует MySQL, но кажется довольно быстрым. На моей системе разница в скорости не так уж велика. Вы уже пробовали использовать кеш Lavarel?   -  person Mike Rockétt    schedule 11.10.2012
comment
Нет, я не использую кеш. Я ожидаю, что Auth сделает это сам, не так ли? Оба класса Cache и Session настроены на использование файловой системы. Если мне нужно кэшировать свои переменные Auth вручную, как мне это сделать?   -  person Marc-François    schedule 11.10.2012
comment
Что ж, это будет не Аут, который отнимает большую часть времени. Меня больше беспокоит кеширование результатов базы данных. В нынешнем виде Auth довольно хорош и не имеет проблем со скоростью.   -  person Mike Rockétt    schedule 11.10.2012
comment
И инструмент кеширования, насколько я знаю, не автоматический. Еще не было необходимости использовать это.   -  person Mike Rockétt    schedule 11.10.2012
comment
Запросы к базе данных поступают от Auth. Больше ничего не использую. Мое приложение по-прежнему очень простое.   -  person Marc-François    schedule 11.10.2012
comment
Понятно. Не могли бы вы поделиться своим мнением?   -  person Mike Rockétt    schedule 11.10.2012


Ответы (2)


Я наконец нашел способ исправить это.

Читая на многих форумах сообщения о XAMPP, MySQL и PHP, я где-то читал, что предпочтительнее использовать 127.0.0.1, потому что locahost нуждается в дополнительном поиске в DNS.

В файле конфигурации базы данных я просто изменил locahost на 127.0.0.1.

Теперь все быстро.

Я нахожу это действительно странным. Использование locahost в файле конфигурации, чтобы соединение с базой данных заняло больше секунды!

person Marc-François    schedule 12.10.2012
comment
Я хотел бы знать, у кого еще может быть такая же проблема. Видите ли, как я сказал в своем последнем комментарии, мои запросы в среднем меньше секунды, и я использую поиск имени хоста. Фактически, у меня есть менеджер домена с множеством локальных доменов. Тем не менее, я не пробовал вернуться к IP ... - person Mike Rockétt; 12.10.2012
comment
Если система настроена правильно, поиск по DNS для localhost не должен выполняться, поскольку он должен быть в hosts файле в вашей системе. Я бы проверил - это похоже на результат необычной настройки DNS - person Adam Hopkinson; 13.10.2012
comment
Спасибо! Я пробовал это в Windows с помощью Z-WAMP (application / config / database.php), и там огромная заметная разница! - person jpmonette; 28.10.2012
comment
@ marc-francois Мне любопытна эта проблема. Я предполагаю, что вы испытывали это в системе Windows? - person dualed; 18.01.2013
comment
Ух ты! Удивительный. После изменения localhost на 127.0.0.1 в проекте, который я разрабатываю, огромная разница. Когда конфигурация базы данных использовала localhost, время загрузки страницы составляло 1092,40 мс. Теперь, после изменения, 58,36 мс! - person Fuhrmann; 18.02.2013
comment
ПОРАЖЕН. Не знал, что один поиск будет так дорого. Теперь это супер-быстро. Я всегда думал, что это будет кешировано. - person Deepak Thomas; 06.07.2014
comment
Это странно. Также много времени потребуется, если вы сделаете telnet localhost 3306 в командной строке? У вас есть 127.0.0.1 localhost в вашем C:\Windows\System32\drivers\etc\hosts файле? Для localhost не должно быть никакого DNS-поиска. - person jbx; 09.09.2014
comment
Основываясь на этом ответе stackoverflow.com/a/16134366/905801, использование 172.0.0.1 должно быть медленнее, чем localhost, потому что первое установит соединение TCP, но второе (localhost) будет использовать сокет домена UNIX, который быстрее согласно этим тестам redis.io/ темы / тесты - person AbdelHady; 22.04.2015

Я не согласен с примером Хаммо. Наличие в сеансе любой информации о пользователях, кроме их идентификатора, представляет собой угрозу безопасности, поэтому большинство фреймворков выбирают этот путь. Выполняется ли что-нибудь еще, когда пользователь входит в систему, кроме запроса их записи? Это точно не значит, что это замедляет работу вашего приложения.

person Oddman    schedule 11.10.2012
comment
Ну, кроме двух или трех @if (Auth::check()) @include('some.stuff') @endif, я не знаю. - person Marc-François; 11.10.2012
comment
Вы выполняете проверку аутентификации в представлении лезвия? Может, включение тормозит? - person Oddman; 11.10.2012
comment
Да, проверка аутентификации выполняется в представлении Blade. @Include предназначен для простого меню и некоторых ссылок, которые я хочу показать или скрыть. - person Marc-François; 11.10.2012
comment
Я вижу, откуда взялся @Oddman, хотя не думаю, что в данном случае это применимо. Ничего из этого не потребует около 1000 миллисекунд для рендеринга, хотя я не могу это точно подтвердить. Возможно, проверка вашей скорости путем выполнения вычислений на основе LARAVEL_START и вставка вызова к нему сразу после каждого соответствующего вызова в вашем представлении должна показать вам, что не так. - person Mike Rockétt; 11.10.2012
comment
Спасибо за идею, Майкл. Теперь я нашел больше информации о проблеме. Я редактировал вопрос с этой информацией. - person Marc-François; 11.10.2012
comment
Да, это кажется очень странным. Единственное, что я бы посоветовал, - это полностью отключить представление и по крупицам поработать над локализацией проблемы. Очень интересно узнать, в чем проблема. - person Oddman; 11.10.2012
comment
Довольно интересно, что Auth::check() вызывает проблему ... Вы пробовали Auth::guest()? Еще не смотрел базовый код (сейчас я на работе). - person Mike Rockétt; 11.10.2012
comment
Или просто запустите фильтр на своем маршруте, передав инструкцию в виде массива: array('before' => 'auth'), function (x) .... - person Mike Rockétt; 11.10.2012
comment
Я нахожу это очень интересным. Мое текущее приложение для интрасети (почти завершено, много таблиц и записей в каждом), и при входе в систему оно составляет в среднем 600 мс (200 при выходе из системы). Итак, я не могу понять. Я уверен, что кто-нибудь сможет найти проблему. - person Mike Rockétt; 11.10.2012
comment
Это действительно интересно - я собираюсь устроить одеяло сегодня вечером, когда вернусь домой, и сделаю тест для себя, и посмотрю, получу ли я те же результаты - это определенно большой прыжок. - person Oddman; 12.10.2012
comment
Хорошо, спасибо большое. Я обнаружил, что проблема связана с подключением к базе данных. Мы приближаемся. Я добавил информацию в вопрос. - person Marc-François; 12.10.2012
comment
@ Marc-François Почему бы вам не установить константу внутри фильтра до и не установить значение константы истина или ложь. Таким образом, в представлении ur вы можете избежать использования статических вызовов методов. Пример USER_IS_LOGIN = Auth :: check (); и поместите это в фильтр «До» внутри application / routes.php Попробуйте этот подход. :) - person Raftalks; 13.10.2012
comment
Да, это может быть лучше. Я попробовал, и это не оказалось проблемой, которую я решил, как вы можете видеть в моем ответе. - person Marc-François; 13.10.2012