Использую CMS на Laravel 10 в котором нет кэширования в контроллерах. Авторы CMS не спешат добавить кэширование в свой скрипт. Не знаю почему. Часто выпускают обновления. Можно ли в Laravel 10 включить глобальное кэширование, прописав код в одном или паре файлов, чтобы после обновления ненужно было прописывать мои изменения в каждом контроллере, а только в паре файлов? Имею ввиду, что мне нужно закэшированные страницы запомнить навсегда, без срока жизни кэша. Если это можно сделать, то в каком файле/файлах что прописать? В документации я не нашел ответ на мой вопрос. В документации описывается работа кэша с каждым контроллером. Это мне не подходит.
Сделал, спасибо! До кэширования: Speed Index 4.2 s После кэширования: Speed Index 1.8 s Что-то ещё нужно подкрутить, чтобы хотя бы стало Speed Index 1.1 s.
В Laravel 10 можно реализовать глобальное кэширование для всех контроллеров, используя middleware. Это позволит вам добавить кэширование в одном месте, и его настройка будет применяться ко всем контроллерам. Middleware можно настроить так, чтобы кэшировать страницы навсегда, но для этого потребуется учитывать, что обновление контента будет требовать явной очистки кэша. Вот шаги, которые нужно выполнить: 1. **Создайте новый middleware:** Выполните команду в терминале для создания нового middleware: ```bash php artisan make:middleware CacheResponse ``` 2. **Отредактируйте созданный middleware:** Откройте файл `app/Http/Middleware/CacheResponse.php` и добавьте следующий код: ```php <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; class CacheResponse { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle(Request $request, Closure $next) { // Создаем уникальный ключ кэша на основе URL $key = 'response|' . $request->fullUrl(); // Проверяем наличие кэша if (Cache::has($key)) { return response(Cache::get($key)); } // Получаем ответ от следующего middleware/контроллера $response = $next($request); // Сохраняем ответ в кэш навсегда Cache::forever($key, $response->getContent()); return $response; } } ``` 3. **Зарегистрируйте middleware:** Откройте файл `app/Http/Kernel.php` и добавьте ваше middleware в массив `$middlewareGroups`. Например, если вы хотите применять его ко всем веб-запросам, добавьте его в группу `web`: ```php protected $middlewareGroups = [ 'web' => [ // другие middleware... \App\Http\Middleware\CacheResponse::class, ], 'api' => [ // другие middleware... ], ]; ``` 4. **Очистка кэша (по необходимости):** Поскольку кэширование настроено без срока жизни, вам нужно предусмотреть способ очистки кэша, когда контент обновляется. Вы можете создать artisan-команду для очистки кэша или добавить вызовы `Cache::forget($key)` в соответствующие места в коде. Пример artisan-команды для очистки всего кэша: ```bash php artisan cache:clear ``` Или вы можете создать свою команду: ```bash php artisan make:command ClearPageCache ``` Затем отредактируйте созданную команду в `app/Console/Commands/ClearPageCache.php`: ```php <?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\Cache; class ClearPageCache extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'cache:clear-pages'; /** * The console command description. * * @var string */ protected $description = 'Clear the page cache'; /** * Execute the console command. * * @return int */ public function handle() { Cache::flush(); $this->info('Page cache cleared.'); return 0; } } ``` Зарегистрируйте команду в `app/Console/Kernel.php`: ```php protected $commands = [ \App\Console\Commands\ClearPageCache::class, ]; ``` Теперь, когда вы обновите CMS, вам нужно будет только удостовериться, что middleware зарегистрирован в `Kernel.php`, и ваше кэширование будет продолжать работать. Этот подход минимизирует количество изменений, которые необходимо вносить после обновлений CMS.
@GdeRabota.ru, Как исключить админку из кэширования? Ссылка в админку выглядит так: _https://mysite.com/admin/
@mkramer, сейчас обнаружил, что страницы с .xml отдает с искажениями из кэша. Нужно эти страницы тоже исключить из кэширования. Не знаю как правильно написать исключения. В документации Laravel 10 есть пример: Код (Text): Route::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // Uses first & second middleware... }); Route::get('/user/profile', function () { // Uses first & second middleware... }); }); Я так понимаю, что отредактированный код нужно прописать в файл /routers/web.php Но в документации не нашел как прописать исключения. Можете отредактировать пример, и внести исключения?