За последние 24 часа нас посетили 16744 программиста и 1692 робота. Сейчас ищут 1316 программистов ...

Можно ли в Laravel 10 включить глобальное кэширование прописав код в одном или паре файлов?

Тема в разделе "Laravel", создана пользователем Vaska, 9 май 2024.

Метки:
  1. Vaska

    Vaska Активный пользователь

    С нами с:
    7 ноя 2019
    Сообщения:
    49
    Симпатии:
    5
    Использую CMS на Laravel 10 в котором нет кэширования в контроллерах.
    Авторы CMS не спешат добавить кэширование в свой скрипт. Не знаю почему.
    Часто выпускают обновления.
    Можно ли в Laravel 10 включить глобальное кэширование, прописав код в одном или паре файлов, чтобы после обновления ненужно было прописывать мои изменения в каждом контроллере, а только в паре файлов?

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

    В документации я не нашел ответ на мой вопрос.
    В документации описывается работа кэша с каждым контроллером. Это мне не подходит.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.575
    Симпатии:
    1.759
    Мидлвары
     
    Vaska нравится это.
  3. Vaska

    Vaska Активный пользователь

    С нами с:
    7 ноя 2019
    Сообщения:
    49
    Симпатии:
    5
    Сделал, спасибо!
    До кэширования: Speed Index 4.2 s
    После кэширования: Speed Index 1.8 s

    Что-то ещё нужно подкрутить, чтобы хотя бы стало Speed Index 1.1 s.
     
    mkramer нравится это.
  4. Дюран

    Дюран Активный пользователь

    С нами с:
    9 мар 2018
    Сообщения:
    284
    Симпатии:
    21
    А что за цмс?
     
  5. Vaska

    Vaska Активный пользователь

    С нами с:
    7 ноя 2019
    Сообщения:
    49
    Симпатии:
    5
    botble и любая тема для него.
     
    Дюран нравится это.
  6. GdeRabota.ru

    GdeRabota.ru Новичок

    С нами с:
    13 май 2024
    Сообщения:
    7
    Симпатии:
    2
    В 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.
     
    Vaska нравится это.
  7. Vaska

    Vaska Активный пользователь

    С нами с:
    7 ноя 2019
    Сообщения:
    49
    Симпатии:
    5
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.575
    Симпатии:
    1.759
    Не вешать на её группу этот мидлвар.
    Route::withoutMiddleware
     
  9. Vaska

    Vaska Активный пользователь

    С нами с:
    7 ноя 2019
    Сообщения:
    49
    Симпатии:
    5
    @mkramer,
    сейчас обнаружил, что страницы с .xml отдает с искажениями из кэша.
    Нужно эти страницы тоже исключить из кэширования.
    Не знаю как правильно написать исключения.
    В документации Laravel 10 есть пример:
    Код (Text):
    1. Route::middleware(['first', 'second'])->group(function () {
    2.     Route::get('/', function () {
    3.         // Uses first & second middleware...
    4.     });
    5.     Route::get('/user/profile', function () {
    6.         // Uses first & second middleware...
    7.     });
    8. });
    Я так понимаю, что отредактированный код нужно прописать в файл /routers/web.php
    Но в документации не нашел как прописать исключения.
    Можете отредактировать пример, и внести исключения?