Я пробовал реализовать кеширование в приложении Laravel 7 через промежуточное ПО.
Как я вижу, ключ создается, а содержимое кэшируется внутри storage/framework/cache
каталога в /data/b4/91/b491d9177c0ac28e06b7ab7f9992a902230a56b
c 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, пожалуйста