GuzzleHttp и Memcached ключ - PullRequest
       8

GuzzleHttp и Memcached ключ

0 голосов
/ 07 февраля 2019

Я играю с клиентом GuzzleHttp, GuzzleCacheMiddleware и Memcached.

Установка вызывает один и тот же URL с разными параметрами.

Это приводит к одному!попадание в memcached, поэтому я думаю, что ключ memcached создается из URL-адреса и только URL-адреса.

Можно ли как-то изменить это поведение, поэтому ключ включает в себя md5 параметров?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

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

Пользовательский класс для создания ключа кэша.

class ParamsGreedyCacheStrategy extends GreedyCacheStrategy
{
    /**
     * Ignoring any headers, just straight up cache key based on method, URI, request body/params
     *
     * @param RequestInterface $request
     * @param KeyValueHttpHeader|null $varyHeaders
     * @return string
     */
    protected function getCacheKey(RequestInterface $request, KeyValueHttpHeader $varyHeaders = null)
    {
        return hash(
            'sha256',
            'greedy' . $request->getMethod() . $request->getUri() . $request->getBody()
        );
    }
}

Создание запросов.Я использовал кэширование Laravel здесь, вы можете использовать memcached.Я также разрешаю кэшировать метод POST HTTP, потому что по умолчанию кэшируется только GET!

$handlerStack = HandlerStack::create();

$cacheMiddleware = new CacheMiddleware(
    new ParamsGreedyCacheStrategy(
        new LaravelCacheStorage(
            Cache::store('file')
        ),
        10
    )
);

// Not documented, but if you look at the source code they have methods for setting allowed HTTP methods. By default, only GET is allowed (per standards).
$cacheMiddleware->setHttpMethods(['GET' => true, 'POST' => true]);

$handlerStack->push(
    $cacheMiddleware,
    'cache'
);

$client = new Client([
    'base_uri' => 'https://example.org',
    'http_errors' => false,
    'handler' => $handlerStack
]);


for($i = 0; $i < 4; $i++) {
    $response = $client->post('/test', [
        'form_params' => ['val' => $i]
    ]);
    // Middleware attaches 'X-Kevinrob-Cache' header that let's us know if we hit the cache or not!
    dump($response->getHeader('X-Kevinrob-Cache'));
}
0 голосов
/ 07 февраля 2019

Вы должны создать свой собственный класс CacheStrategy.Например, вы можете расширить PrivateCacheStrategy класс и переопределить метод getCacheKey, который отвечает за создание ключа кэша.

https://github.com/Kevinrob/guzzle-cache-middleware/blob/master/src/Strategy/PrivateCacheStrategy.php#L123

Вы правы, что он создает ключ хранения только на основеURL и метод запроса.

...