Как очистить кэш laravel

Обновлено: 06.07.2024

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

в основном я хочу очистить кэш представлений.

увидел вопрос почти так же, как это, но это не помогает мне.

вы можете вызвать команду ремесленника вне CLI.

обновление

нет способа удалить кэш представления. Ни php artisan cache:clear это.

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

но мой настоящий вопрос вам действительно нужно очистить кэш вида? В проекте, над которым я работаю сейчас, у меня почти 100 кэшированных представлений, и они весят менее 1 Мб, в то время как мой vendor каталог > 40 Мб. Я не думаю, что кэш view является реальным узким местом в использовании диска и никогда не имел реальной необходимости его очищать.

как для кэш приложения, хранится в

можно ли использовать приведенный ниже код с новыми командами clear cache:

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

конфигурация кэширования Конфигурация laravel распространяется на десятки файлов, и including каждый из них для каждого запроса является дорогостоящим процессом. Чтобы объединить все файлы конфигурации в один, используйте:

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

маршруты кэширование Маршрутизация также является дорогостоящей задачей в laravel. Кэшировать маршруты.php-файл выполните следующую команду:

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

оптимизация Classmap

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

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

в дополнительные компилируемые файлы (опять же: поставщики услуг, промежуточные программы и т. д.) должны быть объявлены вами в config/compile.php, в ключе файлов. Как только вы поместите туда все необходимое для каждого запроса, сделанного в ваше приложение, объедините их в один файл с:

оптимизация загрузки композитора

это не только для laravel, но и для любого приложения, которое использует composer.

я объясню сначала, как PSR-4 autoload работает, а затем я покажу вам, какую команду вы должны запустить, чтобы оптимизировать ее. Если вам не интересно знать, как работает composer, я рекомендую вам перейти непосредственно к консольной команде.

когда вы спрашиваете композитора для App\Controllers\AuthController class, он сначала ищет прямую ассоциацию в classmap. Classmap представляет собой массив с 1-к-1 ассоциациями классов и файлов. Поскольку, конечно, вы не вручную добавили класс Login и связанный с ним файл в classmap, composer будет двигаться дальше и искать в пространствах имен. Потому что App-это пространство имен PSR-4, которое по умолчанию поставляется с Laravel и связано с app/ папка, composer попытается преобразовать имя класса PSR-4 в имя файла с помощью основных процедур обработки строк. В конце концов, он догадывается, что App\Controllers\AuthController должен быть расположен в AuthController.php-файл, который находится в Controllers/ папка, которая, к счастью, должна быть в папке пространства имен, которая является app/ .

вся эта тяжелая работа только чтобы получить это App\Controllers\AuthController класс существует в . Чтобы composer сканировал все ваше приложение и создавал прямые ассоциации классов и файлов 1 к 1, выполните следующую команду:

имейте в виду, что если вы уже запустили php artisan optimize --force, вам больше не нужно запускать этот. Поскольку команда optimize уже говорит composer создать оптимизированную загрузку.

Некоторые задачи по извлечению или обработке данных, выполняемые вашим приложением, могут потребовать больших ресурсов ЦП или занять несколько секунд. В этом случае извлеченные данные обычно кешируют на некоторое время, чтобы их можно было быстро извлечь при последующих запросах тех же данных. Кешированные данные обычно хранятся в хранилище с быстрым доступом данных, например, Memcached или Redis.

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

Конфигурирование

Файл конфигурации кеша вашего приложения находится в config/cache.php . В этом файле вы можете указать, какой драйвер кеша вы хотите использовать по умолчанию для всего приложении. Laravel из коробки поддерживает популярные механизмы кеширования, такие как Memcached, Redis, DynamoDB и реляционные базы данных. Кроме того, доступен драйвер кеширования на основе файлов, в то время как драйверы array и null предоставляют удобные механизмы кеширования для ваших автоматических тестов.

Файл конфигурации кеша также содержит различные другие параметры, которые описаны в файле, поэтому обязательно изучите эти параметры. По умолчанию Laravel настроен на использование драйвера кеширования файлов, который хранит сериализованные кешированные объекты в файловой системе сервера. Для более крупных приложений рекомендуется использовать более надежный драйвер, например Memcached или Redis. Вы даже можете настроить несколько конфигураций кеша для одного и того же драйвера.

Предварительная подготовка драйверов

Предварительная подготовка драйвера на основе базы данных

При использовании драйвера кеша database вам нужно будет настроить таблицу для хранения элементов кеша. Вы найдете пример объявления Schema ниже:

Вы также можете использовать команду php artisan cache:table Artisan для генерации миграции с правильной схемой.

Предварительная подготовка драйвера на основе Memcached

Для использования драйвера Memcached требуется установить пакет Memcached PECL. Вы можете перечислить все ваши серверы Memcached в файле конфигурации config/cache.php . Этот файл уже содержит запись memcached.servers для начала:

При необходимости вы можете задать параметр host сокета UNIX. Если вы это сделаете, то параметр port должен быть задан как 0 :

Предварительная подготовка драйвера на основе Redis

Перед использованием драйвера кеша Redis, вам нужно будет либо установить расширение PHP PhpRedis через PECL, либо установить пакет predis/predis (

1.0) через Composer. Laravel Sail уже включает это расширение. Кроме того, на официальных платформах развертывания Laravel, таких как Laravel Forge и Laravel Vapor, расширение PhpRedis установлено по умолчанию.

Для получения дополнительной информации о настройке Redis обратитесь к его странице документации Laravel.

DynamoDB

Перед использованием драйвера кеширования DynamoDB необходимо создать таблицу DynamoDB для хранения всех кешированных данных. Обычно эта таблица называется cache . Однако вы должны назвать таблицу в соответствии со значением параметра stores.dynamodb.table конфигурационного файла cache вашего приложения.

Эта таблица также должна иметь строковый ключ раздела с именем, которое соответствует значению параметра stores.dynamodb.key конфигурационного файла cache вашего приложения. По умолчанию ключ раздела называется key .

Управление кешем приложения

Получение экземпляра кеша

Чтобы получить экземпляр хранилища кеша, вы можете использовать фасад Cache , который мы будем использовать в этой документации. Фасад Cache обеспечивает удобный и краткий доступ к базовым реализациям контрактов кеширования Laravel:

Доступ к различным кеш-хранилищам

Используя фасад Cache , вы можете получить доступ к различным хранилищам кеша с помощью метода store . Ключ, переданный методу store , должен соответствовать одному из хранилищ, перечисленных в массиве stores вашего конфигурационного файла config/cache.php :

Получение элементов из кеша

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

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

Проверка наличия элемента

Метод has используется для определения того, существует ли элемент в кеше. Этот метод также вернет false , если элемент существует, но его значение равно null :

Увеличение и уменьшение отдельных значений в кеше

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

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

По желанию можно получить элемент из кеша, но также сохранить значение по умолчанию, если запрошенный элемент не существует. Например, вы можете получить всех пользователей из кеша или, если они не существуют, получить их из базы данных и добавить их в кеш. Вы можете сделать это с помощью метода Cache::remember :

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

Вы можете использовать метод rememberForever , чтобы получить элемент из кеша или сохранить его навсегда, если он не существует:

Получение данных с последующим удалением элемента

Если вам нужно получить элемент из кеша, а затем удалить этот элемент, вы можете использовать метод pull . Как и в методе get , если элемент не существует в кеше, то будет возвращен null :

Сохранение элементов в кеше

Вы можете использовать метод put фасада Cache для сохранения элементов в кеше:

Если время хранения не передается методу put , то элемент будет храниться бесконечно:

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

Сохранение значений при условии их отсутствия

Метод add добавит элемент в кеш, только если он еще не существует в хранилище кеша. Метод вернет true , если элемент был действительно добавлен в кеш. В противном случае метод вернет false . Метод add – это атомарная операция:

Сохранение элементов на постоянной основе

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

Если вы используете драйвер memcached , то элементы, которые хранятся «на постоянной основе», могут быть удалены, когда кеш достигнет предельного размера.

Удаление элементов из кеша

Вы можете удалить элементы из кеша с помощью метода forget :

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

Вы можете очистить весь кеш, используя метод flush :

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

Глобальный помощник кеша

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

Если вы передадите массив пар ключ / значение и срок хранения в функцию, то она будет хранить значения в кеше в течение указанного времени:

Когда функция cache вызывается без каких-либо аргументов, то она возвращает экземпляр реализации Illuminate\Contracts\Cache\Factory , позволяя вам вызывать другие методы кеширования:

При тестировании вызова глобальной функции cache вы можете использовать метод Cache::shouldReceive так же, как если бы вы тестировали фасад.

Тегированный кеш

Теги кеширования не поддерживаются при использовании драйверов кеширования file , dynamodb или database . Более того, при использовании нескольких тегов с кешами, которые хранятся «на постоянной основе», то производительность будет лучше с драйвером, таким как memcached , который автоматически очищает устаревшие записи.

Сохранение элементов тегированного кеша

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

Доступ к элементам тегированного кеша

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

Удаление элементов тегированного кеша

Вы можете удалить все элементы, которым назначен тег или список тегов. Например, эта операция удалит все кеши, помеченные либо people , либо authors , либо обоими. Таким образом, и Anne , и John будут удалены из кеша:

Напротив, эта операция удалит только кешированные значения, помеченные как authors , поэтому будет удалена Anne , но не John :

Атомарные блокировки

Чтобы использовать этот функционал, ваше приложение должно использовать драйвер кеша memcached , redis , dynamodb , database , file , или array в качестве драйвера кеша по умолчанию для вашего приложения. Кроме того, все серверы должны взаимодействовать с одним и тем же центральным сервером кеширования.

Предварительная подготовка драйверов

Предварительная подготовка драйвера на основе базы данных для атомарных блокировок

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

Управление блокировками

Атомарные блокировки позволяют управлять распределенными блокировками, не беспокоясь об условиях приоритетности. Например, Laravel Forge использует атомарные блокировки, чтобы гарантировать, что на сервере одновременно выполняется только одна удаленная задача. Вы можете создавать и управлять блокировками, используя метод Cache::lock :

Метод get также принимает замыкание. После выполнения замыкания Laravel автоматически снимет блокировку:

Если блокировка недоступна в тот момент, когда вы ее запрашиваете, вы можете указать Laravel подождать определенное количество секунд. Если блокировка не может быть получена в течение указанного срока, то будет выброшено исключение Illuminate\Contracts\Cache\LockTimeoutException :

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

Управление блокировками между процессами

Иногда может потребоваться установить блокировку в одном процессе и снять ее в другом процессе. Например, вы можете получить блокировку во время веб-запроса и захотите снять блокировку в конце задания в очереди, которое запускается этим запросом. В этом сценарии вы должны передать «токен инициатора» с областью действия блокировки в задание в очереди, чтобы задание могло повторно создать экземпляр блокировки с использованием данного токена.

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

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

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

Добавление собственных драйверов кеша

Написание драйвера кеша

Чтобы создать собственный драйвер кеша, сначала нужно реализовать контракт Illuminate\Contracts\Cache\Store . Итак, реализация кеша MongoDB может выглядеть примерно так:

Нам просто нужно реализовать каждый из этих методов, используя соединение MongoDB. Для примера того, как реализовать каждый из этих методов, взгляните на Illuminate\Cache\MemcachedStore в исходном коде фреймворка Laravel. Как только наша реализация будет завершена, мы можем завершить регистрацию своего драйвера, вызвав метод extend фасада Cache :

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

Первым аргументом, передаваемым методу extend , является имя драйвера. Это будет соответствовать вашему параметру driver в файле конфигурации config/cache.php . Второй аргумент – это замыкание, которое должно возвращать экземпляр Illuminate\Cache\Repository . Замыкание будет передано экземпляру $app , который является экземпляром контейнера служб.

После регистрации расширения обновите параметр driver в файле конфигурации config/cache.php , указав имя вашего расширения.

События

Чтобы выполнить код для каждой операции с кешем, вы можете прослушивать события, запускаемые кешем. Как правило, вы должны поместить эти слушатели событий в класс App\Providers\EventServiceProvider приложения:

Laravel предоставляет выразительный, универсальный API для различных систем кэширования. Настройки кэша находятся в файле config/cache.php . Здесь вы можете указать драйвер, используемый по умолчанию в вашем приложении. Laravel изначально поддерживает многие популярные системы, такие как Memcached и Redis.

Этот файл также содержит множество других настроек, которые в нём же документированы, поэтому обязательно ознакомьтесь с ними. По умолчанию, Laravel настроен для использования драйвера file , который хранит сериализованные объекты кэша в файловой системе. Для больших приложений рекомендуется использование более надёжных драйверов, таких как Memcached или Redis. Вы можете настроить даже несколько конфигураций кэширования для одного драйвера.

Необходимые условия для драйверов

База данных

Перед использованием драйвера database вам нужно создать таблицу для хранения элементов кэша. Ниже приведён пример объявления структуры Schema :

Также вы можете использовать Artisan-команду sh php artisan cache:table для генерации миграции с правильной схемой.

Система Memcached

Для использования системы кэширования Memcached необходим установленный пакет Memcached PECL. Вы можете перечислить все свои сервера Memcached в файле настроек config/cache.php :

Вы также можете задать параметр host для пути UNIX-сокета. В этом случае в параметр port следует записать значение 0 :

Система Redis

Перед тем, как использовать систему Redis необходимо установить пакет predis/predis (

1.0) с помощью Composer.

Загляните в раздел по настройке Redis

Использование кэша

Получение экземпляра кэша

Контракты Illuminate\Contracts\Cache\Factory и Illuminate\Contracts\Cache\Repository предоставляют доступ к службам кэша Laravel. Контракт Factory предоставляет доступ ко всем драйверам кэша, определённым для вашего приложения. А контракт Repository обычно является реализацией драйвера кэша по умолчанию для вашего приложения, который задан в файле настроек cache .

А также вы можете использовать фасад Cache , который мы будем использовать в данной статье. Фасад Cache обеспечивает удобный и лаконичный способ доступа к лежащим в его основе реализациям контрактов кэша Laravel:

В этом примере для версии 5.1 и ранее использовался ещё один контроллер PHP use Illuminate \ Routing \ Controller ; — прим. пер.

Доступ к нескольким хранилищам кэша

Используя фасад Cache можно обращаться к разным хранилищам кэша с помощью метода PHP store () . Передаваемый в метод ключ должен соответствовать одному из хранилищ, перечисленных в массиве stores в вашем файле настроек cache :

Получение элементов из кэша

Для получения элементов из кэша используется метод PHP get () фасада Cache . Если элемента в кэше не существует, будет возвращён PHP null . При желании вы можете указать другое возвращаемое значение, передав его вторым аргументом метода PHP get () :

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

Проверка существования элемента

Для определения существования элемента в кэше используется метод PHP has () . Он вернёт PHP false , если значение равно PHP null :

Увеличение/уменьшение значений

Для изменения числовых элементов кэша используются методы PHP increment () и PHP decrement () . Оба они могут принимать второй необязательный аргумент, определяющий значение, на которое нужно изменить значение элемента:

Получить или сохранить

Иногда необходимо получить элемент из кэша и при этом сохранить значение по умолчанию, если запрашиваемый элемент не существует. Например, когда необходимо получить всех пользователей из кэша, а если они не существуют, получить их из базы данных и добавить в кэш. Это можно сделать с помощью метода PHP Cache :: remember () :

Если элемента нет в кэше, будет выполнено переданное в метод PHP remember () замыкание, а его результат будет помещён в кэш.

Также можно комбинировать методы PHP remember () и PHP forever () :

Получить и удалить

При необходимости получить элемент и удалить его из кэша используется метод PHP pull () . Как и метод PHP get () , данный метод вернёт PHP null , если элемента не существует:

Сохранение элементов в кэш

Для помещения элементов в кэш используется метод PHP put () фасада Cache . При помещении элемента в кэш необходимо указать, сколько минут его необходимо хранить:

Вместо указания количества минут, можно передать экземпляр PHP-типа PHP DateTime , для указания времени истечения срока хранения:

Сохранить, если такого нет

Метод PHP add () просто добавит элемент в кэш, если его там ещё нет. Метод вернёт true , если элемент действительно будет добавлен в кэш. Иначе — false :

Сохранить навсегда

Для бесконечного хранения элемента кэша используется метод PHP forever () . Поскольку срок хранения таких элементов не истечёт никогда, они должны удаляться из кэша вручную с помощью метода PHP forget () :

При использовании драйвера Memcached элементы, сохранённые «навсегда» , могут быть удалены, когда размер кэша достигнет своего лимита.

Удаление элементов из кэша

Можно удалить элементы из кэша с помощью метода PHP forget () :

Вы можете очистить весь кэш методом PHP flush () :

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

Вспомогательная функция PHP Cache ()

Помимо использования фасада Cache или контракта кэша, вы также можете использовать глобальную функцию PHP cache () для получения данных из кэша и помещения данных в него. При вызове функции PHP cache () с одним строковым аргументом она вернёт значение данного ключа:

Если вы передадите в функцию массив пар ключ/значение и время хранения, она сохранит значения в кэше на указанное время:

При тестировании вызова глобальной функции PHP cache () вы можете использовать метод PHP Cache :: shouldReceive () , как при тестировании фасада.

Теги кэша

Теги кэша не поддерживаются драйверами file и database . Кроме того, при использовании нескольких тегов для кэшей, хранящихся «вечно» , лучшая производительность будет достигнута при использовании такого драйвера как memcached , который автоматически зачищает устаревшие записи.

Сохранение элементов с тегами

Теги кэша позволяют отмечать связанные элементы в кэше, и затем сбрасывать все элементы, которые были отмеченны одним тегом. Вы можете обращаться к кэшу с тегами, передавая упорядоченный массив имён тегов. Например, давайте обратимся к кэшу с тегами и поместим в него значение методом PHP put () :

Обращение к элементам кэша с тегами

Для получения элемента с тегом передайте тот же упорядоченный список тегов в метод PHP tags () , а затем вызовите метод PHP get () с тем ключом, который необходимо получить:

Удаление элементов кэша с тегами

Вы можете очистить все элементы с заданным тегом или списком тегов. Например, следующий код удалит все элементы, отмеченные либо тегом people, либо authors, либо и тем и другим. Поэтому и Anne и John будут удалены из кэша:

В отличие от предыдущего, следующий код удалит только те элементы, которые отмечены тегом authors, поэтому Anne будет удалён, а John — нет:

Добавление своих драйверов кэша

Написание драйвера

Чтобы создать свой драйвер кэша, нам надо сначала реализовать контракт Illuminate\Contracts\Cache\Store . Итак, наша реализация кэша MongoDB будет выглядеть примерно так:

Нам просто надо реализовать каждый из этих методов, используя соединение MongoDB. Примеры реализации каждого из этих методов можно найти в Illuminate\Cache\MemcachedStore в исходном коде фреймворка. Когда наша реализация готова, мы можем завершить регистрацию нашего драйвера:

Если вы задумались о том, где разместить код вашего драйвера, то можете создать пространство имён Extensions в папке app . Но не забывайте, в Laravel нет жёсткой структуры приложения, и вы можете организовать его как пожелаете.

Чтобы зарегистрировать свой драйвер кэша в Laravel, мы будем использовать метод PHP extend () фасада Cache . Вызов PHP Cache :: extend () можно делать из метода PHP boot () сервис-провайдера по умолчанию App\Providers\AppServiceProvider , который есть в каждом Laravel-приложении. Или вы можете создать свой сервис-провайдер для размещения расширения — только не забудьте зарегистрировать его в массиве провайдеров config/app.php :

Первый аргумент метода PHP extend () — имя драйвера. Оно будет соответствовать параметру driver в вашем файле настроек config/cache.php . Второй аргумент — замыкание, которое должно возвращать экземпляр Illuminate\Cache\Repository . В замыкание будет передан экземпляр PHP $app , который является экземпляром сервис-контейнера.

События кэша

Для выполнения какого-либо кода при каждой операции с кэшем вы можете прослушивать события, инициируемые кэшем. Обычно вам необходимо поместить эти слушатели событий в ваш EventServiceProvider :

Для выполнения какого-либо кода при каждой операции с кэшем вы можете прослушивать события, инициируемые кэшем. Обычно вам необходимо поместить эти слушатели событий в метод PHP boot () вашего EventServiceProvider :

Оптимизация производительности Laravel

С момента своего выпуска в 2011 году, Laravel стал популярным выбором для разработки бизнес-ориентированных приложений. Одна из причин, по которой Laravel очень популярен среди разработчиков, заключается в оптимизации производительности, которая позволяет разработчикам настраивать свои приложения.

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

Сервер

Предполагаю, что вы уже установили Laravel на свой сервер. У меня следующие настройки:

Кэширование конфигурации

В Laravel есть замечательная команда artisan cache config, которая очень полезна для повышения производительности. Основное использование команды заключается в следующем:

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

Для дальнейшей оптимизации производительности вы можете использовать OpCache, который кэширует код php, поэтому вам не придется перекомпилировать его снова и снова.

Кэш маршрутизации

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

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

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

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

Оптимизация автозагрузки Composer

Рекомендуется использовать Composer для сканирования приложения и создания однозначной ассоциации классов и файлов в приложении. Используйте следующую команду:

Лимитируйте подключаемые библиотеки

Важно всегда просмотреть все библиотеки, которые вызываются в коде. Если вы думаете, что можете решить задачу без использования библиотеки — удалите ее из config/app.php, для ускорения Laravel.

JIT-компилятор

Преобразование PHP-кода в байт-код и последующее его выполнение, при каждом запросе, является ресурсоемким процессом. Поэтому, посредники, такие как Zend Engine, нужны для выполнения подпрограмм на C. Чтобы сократить это время, важно повторить этот процесс только один раз, и именно здесь компилятор Just-in-time (JIT) оказывается очень полезным. Для приложений, основанных на Laravel, рекомендуется JIT-компилятор HHVM от Facebook.

Кэш результатов запросов

Используйте жадную загрузку данных

Когда Eloquent использует жадную загрузку, он загружает все связанные объектные модели в ответ на первоначальный запрос. Давайте сравним жадную загрузку (eager loading) и ленивую загрузку (lazy loading).

Запрос ленивой загрузки будет выглядеть следующим образом:

Запрос жадной загрузки будет выглядеть следующим образом:

Прекомпилирование ресурсов

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

Оптимизация сайта на Laravel

Laravel довольно популярный на сегодня фреймворк. На этом фреймворке можно быстро и легко создавать веб-сайты. В отличии от cms, как WordPress, Drupal, Zoomla и т.д., мы не можем установить готовые плагины для улучшения нашего приложения laravel всего за несколько кликов, но Laravel умеет из коробки много функций оптимизации скорости для ускорения вашего сайта. Если вы ищете пошаговое руководство для повышения скорости веб-сайта, то этот пост для вас. В этом посте я покажу вам как увеличить скорость и производительность страниц вашего сайта laravel.

План работы

  1. Минификация HTML
  2. Кэширование маршрутов
  3. Кэширование запросов
  4. Кэширование конфигурации
  5. Bundle & Minify CSS/Js
  6. Оптимизация изображений
  7. Ленивая загрузка
  8. Оптимизация htaccess
  9. Более быстрый сервер веб-хостинг
  10. CDN

Перед началом работы по ускорению, советую посмотреть текущие результаты в Google Page speed, GT Metrix или Pingdom, а затем сравнить улучшения до и после.

1. Минификация HTML

Во время разметки HTML мы сохраняем много пробелов для отступов и повышения читабельности кода. Браузер не заботится о пробелах и отступах, но именно пробелы делают наш HTML-файл больше и влияют на скорость страницы. Мы можем легко уменьшить размер HTML-страницы, объединив HTML с помощью middleware Laravel. Давайте сделаем модификацию HTML с помощью него в laravel.

Добавьте ваш middleware в kernel.php в $routeMiddlewareGroup массив

Теперь мы можем использовать этот middleware в нашем файле маршрута. Для каждого запроса на нашем сайте этот middleware будет автоматически выполнять модификацию HTML и отдавать пользователю сжатый контент.

2. Кэширование маршрутов

Мы можем получить большую скорость запроса-ответа, используя кэширование маршрутов Laravel. Чтобы сделать кэширование маршрута, выполните команду, приведенную ниже.

Эта команда кэширует все маршруты в файле routes.php в каталог bootstrap/cache. Если позже вам нужно будет добавить еще один маршрут или отредактировать его, вам придется очистить кэш маршрутов и сгенерировать его заново.

3. Кэширование запросов

Смотрите, здесь я передаю post slug, который уникален для каждого поста для SEO-friendly URL-адреса.

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

4. Кэширование конфигурации

Эта команда кэширует всю конфигурацию в файл config.php в каталог bootstrap/cache. Если вам нужно добавить / изменить настройки, то вам придется очистить config-cache и повторно сгенерировать его снова. Чтобы очистить кэш конфигурации, выполните команду, приведенную ниже.

5. Bundle & Minify CSS/Js

6. Оптимизация изображений

Изображения довольно важная часть внешнего вида любого сайта. Каждая картинка весит намного больше, чем текстовый контент. Изображения оказывают большое влияние на отчеты Google Page speed insights. Мы можем использовать TinyPng, Cloudinary, Squoosh для получения более оптимизированных изображений. Оптимизированные изображения могут сэкономить пропускную способность, а также быстро загрузить наш сайт.

Пример оптимизированного изображения

оптимизация изображений.формат PNG

Мы можем настроить lazy-load изображений на странице сайта. Это очень удобно, потому что с помощью этого метода загружаются только те изображения, которые в данный момент видны на экране. Когда пользователь прокручивает страницу, то он будет загружать остальные изображения, так что веб-страница загружается быстрее. Чтобы реализовать ленивую загрузку изображения, просто добавьте lazy="loading" атрибут в свой img тег.

7. Нетерпеливая загрузка

Без Нетерпеливой Загрузки

Теперь, если мы запустим цикл коллекции Post, под капотом он выполнит запрос N+1 Без нетерпеливой загрузки это убьет производительность на больших данных.

С Нетерпеливой Загрузкой

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

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

8. Оптимизация htaccess

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

Откройте файл htaccess и добавьте фрагмент кода, приведенный ниже, в конце вашего сайта.

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

9. Используйте CDN

Если ваш сайт имеет высокий трафик из другого региона, то используйте CDN (сеть доставки контента). Он будет доставлять контент вашего сайта с низкой задержкой в сети. Немного резюмируя, предположим, что у вас есть сайт и его хостинг-сервер расположен в США, а вы посетители из США, и большинство посетителей из Европы и Азии. Для пользователей, которые находятся далеко от вашего сервера, время загрузки веб-сайта становится выше, потому что информация перемещается на большое расстояние для вашего посетителя. В этой ситуации вы можете использовать CDN-сервер для посетителей из Европы или Азии. Если вы хотите использовать CDN для своего веб-сайта, то они могут быть лучшим вариантом для вас, приведенным ниже

Читайте также: