Symfony http кэш управляет динамикой c истекает время или как сделать кеш недействительным? - PullRequest
1 голос
/ 01 мая 2020

Я не понимаю, как сделать кеш недействительным, потому что мое appliaction не вызывается, когда я в первый раз возвращаю запрос с заголовком Expires, а затем приложение не вызывается, когда я пытаюсь снова вызвать тот же запрос

    $response
        ->setExpires($this->helper->getExpiresHttpCache());

И я добавил класс

class CacheKernel extends HttpCache
{
protected function invalidate(Request $request, $catch = false)
{
    if ('PURGE' !== $request->getMethod()) {
        return parent::invalidate($request, $catch);
    }

    if ('127.0.0.1' !== $request->getClientIp()) {
        return new Response(
            'Invalid HTTP method',
            Response::HTTP_BAD_REQUEST
        );
    }

    $response = new Response();
    if ($this->getStore()->purge($request->getUri())) {
        $response->setStatusCode(Response::HTTP_OK, 'Purged');
    } else {
        $response->setStatusCode(Response::HTTP_NOT_FOUND, 'Not found');
    }

    return $response;
}

protected function getOptions()
{
    return [
        'default_ttl' => 0,
    ];
}
}

и в индексе. php add

$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
// Wrap the default Kernel with the CacheKernel one in 'prod' environment
if ('prod' === $kernel->getEnvironment()) {
     $kernel = new CacheKernel($kernel);
}

, но HTTP-кеш работает для каждой среды. Только когда в браузере отключен флажок Disable cache приложение будет звонить.

В браузере у меня был правильный заголовок Expires: Fri, 01 May 2020 11:59:00 GMT. И если отправленный запрос снова, с включенной отладкой, отладка не вводится в приложение, но ответ содержит данные результата. В этом случае General секция содержит Status Code: 200 OK (from disk cache)

Request URL: http://symfony.localhost/api/products/extra_fields
Request Method: GET
Status Code: 200 OK (from disk cache)
Remote Address: [::1]:80
Referrer Policy: no-referrer-when-downgrade

Но где же эта точка, где сравнивать текущее время и время exprires? Пример Я хочу использовать глобальные переменные для истечения времени. Пример после вызова какого-то другого API-запроса api/product/{id} Я хочу изменить время истечения для /api/products/extra_fields, но приложение не вызывается, где я могу это сделать или это возможно? Может ли кто-нибудь помочь мне понять, как с этим справиться?

Response
HTTP/1.1 200 OK
Server: nginx
Content-Type: application/json
X-Powered-By: PHP/7.3.14
Cache-Control: private, must-revalidate
Date: Fri, 01 May 2020 07:39:35 GMT
Expires: Fri, 01 May 2020 11:59:00 GMT

Request
GET /api/products/extra_fields HTTP/1.1
accept: application/json
Referer: http://symfony.localhost/api/doc
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36
...