Контрольный список Go Live — 20 элементов настройки производительности приложений Laravel

PHP

file

Давайте начнем! Предположим, что ваше приложение laravel уже запущено.

От первого пользователя, до десятого, сотого, до тысячи пользователей! медленно,Ваш сайт будет работать все медленнее и медленнее с увеличением числа пользователей

так что нам делать?детали имеют значение

После недолгих поисков решил написать это20 советов по ускорению вашего сайта

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

Наслаждайтесь своим обучением! Если у вас есть какие-либо предложения, вы можете оставить сообщение ниже! Я рад обсудить это со всеми вами.

базовая оптимизация

Давайте посмотрим, что мы можем сделать всего за несколько секунд.

1. Кэш маршрута

Каждый раз, когда сервер выполняет запрос, регистрируются все маршруты, что занимает некоторое время. Однако вы можете кэшировать список маршрутов, чтобы пропустить этот шаг.

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

php artisan route:cache

Однако, если вы добавляете или изменяете какую-либо информацию о маршрутизации, не забудьте очистить предыдущий кэш и повторно выполнить команду кэширования.

php artisan route:clear

# 然后,再次执行
php artisan route:cache

Обратите внимание, что это работает только для маршрутизации класса контроллера.

2. Конфигурация кэша

Как и в случае маршрутизации, вы также можете кэшировать файлы конфигурации в своем приложении.

Представьте себе такой сценарий: каждый раз, когда вы отправляете запрос в приложение, Laravel необходимо загрузить другой файл конфигурации и открыть файл *.env* для чтения содержимого. Такой подход неэффективен, не так ли?

Но не волнуйтесь, для этого есть команда Artisan.

php artisan config:cache

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

php artisan config:clear

# 然后,再来一次...
php artisan config:cache

3. Оптимизируйте автозагрузку Composer

В общем, Composer очень быстро генерирует файлы автозагрузки. Однако в производственной среде это может быть медленным, если установлены правила автозагрузки PSR-4 и PSR-0.

Вы можете оптимизировать процесс создания файла автозагрузчика, добавив следующую команду в сценарий развертывания.

$  composer dump-autoload  -o

Не забывайте об этом.

4. Слух: «Не используйте Blade Views слишком часто»

Я слышал этот слух отовсюду.

«Не слишком часто используйте представления Blade, так как это снижает производительность приложений!»

Прямо большая ложь! Серьезное лицо!

Имейте это в виду: Laravel компилирует представления Blade. Компиляция означает, что в конце процесса у вас будет один полный файл, а не несколько файлов.

Так что вообще не стоит волноваться.


Промежуточные галантереи

5. Перейдите на другой/лучший драйвер кэша/сеанса

По умолчанию при создании нового проекта LaravelДрайвером по умолчанию для кэша и сеансов является «Файл».. Это нормально в локальных средах разработки и небольших проектах, но по мере роста проекта становится все больше.

Итак, подумайте о переходе на лучший драйвер, такой как Redis. Laravel имеет встроенную поддержку для этого, и все, что вам нужно сделать, этоУстановить предис.

Подробнее наздесьи здесь.

6. Обновите версию Laravel как можно скорее

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

Так что следите за обновлениями и обновляйте код.

7. Удалите неиспользуемые сервисы

Вот небольшая хитрость, о которой многие люди часто забывают спросить себя:

"А оно мне надо?*

Мы знаем, что Laravel поставляется с множеством сервисов, в конце концов, это полноценный фреймворк, и у каждого сервиса есть свое место.

Поэтому, пожалуйста, найдите время, чтобы проверить файл *config/app.php *, чтобы увидеть, можете ли вы найти службу, которая вам не нужна. Если все работает, попробуйте удалить его и протестировать свое приложение.

Должно помочь (немного)!

8. Запрос с жадной загрузкой

Если вы знаете, что такое Laravel, вы, вероятно, знаете, что такое предварительная загрузка. Если ваша информация не актуальна, активная загрузка — это способ повысить производительность Eloquent за счет использования определенного синтаксиса для уменьшения количества запросов, отправляемых в базу данных.

Эта проблема называется проблемой запроса N+1. Возьмем пример. У вас есть две модели: Книга и Автор. У каждой книги есть свой автор.

$books  =  App\Book::all();

foreach  ($books  as  $book)  {
    echo  $book->author->name;
}

Представьте, что в вашей базе данных 1000 книг. Теперь этот код выполнит ** 1001 ** запросов, чтобы получить имена авторов этих 1000 книг.

1 (запрос для получения данных для 1000 книг) + 1000 (запрос для получения данных об авторе для каждой книги) = 1001.

Однако, если вы пишете такой код

$books  =  App\Book::with('author')->get();

foreach  ($books  as  $book)  {
    echo  $book->author->name;
}

Измените базовый запрос, чтобы избежать этой проблемы с производительностью. Вы будете выполнять только два запроса вместо 1001! Это огромный прирост производительности.

9. Кэшировать результаты запроса

Иногда может быть хорошей идеей кэшировать результаты определенного запроса.

Представьте себе сценарий, в котором вы собираетесь отобразить диаграмму «10 лучших альбомов» на домашней странице вашего приложения. Эта работа выполняется путем выполнения запроса из базы данных (запрос может включать таблицу исполнителей, а также некоторые другие таблицы). Ваша домашняя страница имеет 1000 посещений в час.

Если количество запросов к данным этой таблицы лидеров составляет 1000 в час, то количество запросов, выполненных за один день, равно 24 000. Теперь предположим, что эта таблица лидеров обновляется каждый час. Так как насчет кэширования каждого результата запроса на час?

$value  =  Cache::remember('top_10_albums',  60,  function  ()  {
    return  Album::with('artist',  'producer')->getTopTen();
});

Метод *remember* этого компонента кэша сначала извлекает данные из базы данных и кэширует их на 60 минут, если кэш не найден. По истечении срока действия последние данные будут снова извлечены из базы данных, а кеш будет обновлен.

Количество запросов от 24000 до 24 в сутки.

10. Индексируйте свои таблицы данных

Не забывайте индексировать таблицы данных, когда это необходимо. Это может показаться бесполезным советом, но на самом деле он необходим. Поскольку я видел много приложений, их таблица данных не имеет индекса.

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

Schema::table('my_table_name',  function(Blueprint  $table){
    $table->index('field_to_be_indexed');
});

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

11. Слишком много промежуточного ПО?

Laravel будет делать много вызовов (до/после) к вашему зарегистрированному промежуточному программному обеспечению. Поэтому, пожалуйста, проверьте их внимательно и удалите промежуточное ПО, которое вам не нужно.

Обычно список промежуточного программного обеспечения находится в *Kernel.php*.

12. Время использовать очереди!

Бывают случаи, когда Laravel работает медленнее, чем ожидалось, и вы можете подумать об асинхронном выполнении задач.

Наиболее распространенная ситуация — отправить приветственное письмо и давайте посмотрим на поток задач.

  1. Пользователи заполняют наши формы;
  2. записать свои данные в базу данных;
  3. Отправьте ему электронное письмо с приветственным сообщением и ссылкой для подтверждения;
  4. и отображать страницу благодарности;

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

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


Усовершенствованные сухие товары

13. Использование Pusher для улучшения асинхронных очередей

Выше я что-то писал про очереди. Иногда вы также можете использовать очереди для улучшения задач, с которыми сталкивается пользователь.

Представьте, что вы создаете тяжелый (в вычислительном отношении) процесс и хотите показать пользователю индикатор выполнения этой задачи. Вы можете легко использовать асинхронные задачи в очереди и интегрировать Pusher для отправки сообщений во внешний интерфейс для достижения цели, даже если задача не завершена.

Другой часто используемый пример — отправка сообщения пользователю без обновления страницы.

Подумай об этом!

14. Измеряйте и отлаживайте инструменты с помощью Logs/Debugbars/Laravel Telescope

Есть цитата, которая мне очень нравится, когда речь идет о самосовершенствовании. Слышал это от своего генерального директора (спасибо, Массимо!), цитирующего Питера Друкера.

Если вы не можете это измерить, вы не можете это улучшить.

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

  • медленный журнал:MYSQL, MariaDB и другие базы данных могут включать медленные журналы для отслеживания тех операторов, которые занимают много времени. Вы можете использовать эти данные, чтобы определить, нужно ли изменить или оптимизировать конкретный код (или запросы);

  • Панель отладки: Laravel Debugbarэто отличный пакет расширения. Во многих приложениях вы можете использовать его для сбора данных. Например, запрос, просмотр, время и т. д.;

  • Телескоп Ларавеля:Еще один действительно классный инструментLaravel Telescope, для приложений Laravel имеет репутацию «элегантного помощника по отладке». Если ты заинтересован,Я уже писал об этом статью здесь;

15. Обновите версию PHP

Хотя это кажется достаточно простым, его выполнение может быть громоздким, если ваш проект достаточно большой, поэтому я решил добавить это в расширенный совет.

Если ваша версия PHP ниже 7.0, обновите версии PHP и laravel.

16. Использование Lumen на сервере

Если объем данных вашего приложения сильно увеличивается, вы можете рассмотреть возможность разделения служб для вашей системы. Однако нет четкого руководства, которое поможет вам пройти через это: насколько высок или низок критерий разделения, зависит от многих факторов, начиная от домена приложения и заканчивая работой, необходимой для разделения всего необходимого контента.

Однако после успешного разделения ваш проект получит новую жизнь.

Если вам интересна эта тема, вы можете скачать ее сmedium.com/@mother-daughter/pull if…Начинать.

17. Обслуживание CDN для статических ресурсов

Я почти уверен, что у вас есть много внешних ресурсов, таких как файлы CSS и сценарии JS.

Вы можете уменьшить объем данных, отправляемых пользователю несколькими способами:

  • Сжимать статические ресурсы;
  • Объединяйте статические ресурсы (объединяйте несколько файлов CSS или сценариев JS в один, чтобы уменьшить количество запросов);
  • включить сжатие gzip;

Однако, если у вас большой трафик, вы можете разместить свои статические ресурсы на выделенном сервере CDN, например:

  • Акамай (Акамай);
  • Max CDN;
  • Cloudflare;
  • Сервисы Amazon AWS (S3 + CloudFront);

Примечание переводчика: Youpaiyun и Qiniuyun можно использовать в Китае.

18. Используйте расширенные инструменты измерения

Установка Laravel Debugbar или Telescope была бы хорошим началом, но для более значительных проектов этого недостаточно.

Вам нужно выбрать более продвинутый инструмент, а именно:

  • New Relic;
  • AppOptics;
  • Datadog;
  • Sentry;

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

19. Вертикальное масштабирование

Вы тщательно оптимизировали мельчайшие детали своего кода, но ваше приложение растет в размерах. Рано или поздно вам придется масштабироваться по вертикали.

Есть простая поговорка: больше оперативной памяти, больше места, больше пропускной способности и больше процессора.

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

20. Горизонтальное масштабирование

Горизонтальное расширение — еще один способ расширения, отличающийся от традиционного вертикального расширения двумя основными моментами:

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

С горизонтальным масштабированием можно многое сделать, но как только вы сможете масштабировать свое приложение по горизонтали, преимущества будут невероятными.

В заключение

Хватит контента на сегодня! Я создал этот список, объединив свой личный опыт и некоторые исследования, которые я проводил раньше.

Не стесняйтесь предлагать что-то новое, если хотите, и я буду рад соответствующим образом обновить эту статью.

Получено с https://learnku.com/laravel/t/24559