Laravel 7 Кэш через промежуточное ПО не обращается к кэшированному контенту и отправляет заголовок X-Proxy-Cache: MISS - PullRequest
1 голос
/ 19 июня 2020

Я пробовал реализовать кеширование в приложении Laravel 7 через промежуточное ПО.

Как я вижу, ключ создается, а содержимое кэшируется внутри storage/framework/cache каталога в /data/b4/91/b491d9177c0ac28e06b7ab7f9992a902230a56bc key, который при открытии включает содержимое страницы, которую я пытаюсь кэшировать.

Вот мой класс промежуточного программного обеспечения:

namespace App\Http\Middleware;

use Closure;
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, Closure $next, $ttl=1440)
    {
        if(auth()->user() != null || $request->isMethod('post'))
            return $next($request);
        $params = $request->query(); unset($params['_method']); ksort($params);
        $key = md5(url()->current().'?'.http_build_query($params));
        if($request->get('_method')=='purge')
            Cache::forget($key);
        if(Cache::has($key)){
            $cache = Cache::get($key);
            $response = response($cache['content']);
            $response->header('X-Proxy-Cache', 'HIT');
        }
        else {
            $response = $next($request);
            if(!empty($response->content()))
                Cache::put($key,['content' => $response->content()],$ttl);
            $response->header('X-Proxy-Cache', 'MISS');
        }

        return $response;
    }
}

Проблема, с которой я столкнулся, заключается в том, что последнее условие в Оператор if, похоже, не может получить кэшированное содержимое, поскольку Cache::has($key) всегда возвращает false, даже если ключ существует. Когда я пытаюсь dd(Cache::has($key)), кешированный файл b491d9177c0ac28e06b7ab7f9992a902230a56b удаляется из кеша, оставляя только пустой каталог /data/b4/91/ в storage/framework/cache/

Дополнительная информация:

применяется параметр кеша по маршруту Route::get('/', 'Client\HomePageController@getMain')->middleware('cacheable:5');

и промежуточное ПО зарегистрировано в файле app/Http/Kernel.php в массиве $routeMiddleware как 'cacheable'=> \App\Http\Middleware\CacheResponse::class

help, пожалуйста

1 Ответ

1 голос
/ 20 июня 2020

Я столкнулся с подобной проблемой несколько лет go. Мне удалось это обойти. Причина, по которой вы не можете получить доступ к системе кеширования в промежуточном программном обеспечении, заключается в том, что процесс загрузки еще не завершен. Так я узнал, что Хранилище доступно. Таким образом, в config/filesystem.php я добавил этот диск:

'cache'  => [
        'driver'     => 'local',
        'root'       => storage_path('app/framework/cache'),
    ],

Это то же место, куда Cache помещает свои данные. Таким образом, если вы сохраните «ключ», вы можете сделать это с помощью Storage::disk('cache')->put($key, $data);. Получите его в своем промежуточном программном обеспечении с помощью Storage::disk('cache')->get($key);

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

Edit : Я снизил некоторые требования к диску до минимума. У моей системы хранения есть и другая причина. Но этих настроек было бы достаточно. Этот диск не может быть опубликован c, потому что он не входит в состав папок publi c проекта Laravel.

...