PHP:Guzzle 6 + Guzzle-cache-middleware

时间:2016-05-22 18:35:06

标签: php caching guzzle guzzle6

我使用Guzzle 6进行一些REST查询。它运行正常,但有时它会变慢,因为它总是在进行查询。我发现有guzzle-cache-middleware应该缓存来自远程API的响应。

但是我无法使用它,我的代码如下:

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use League\Flysystem\Adapter\Local;
use Kevinrob\GuzzleCache\CacheMiddleware;
use Kevinrob\GuzzleCache\Strategy\PrivateCacheStrategy;
use Kevinrob\GuzzleCache\Storage\FlysystemStorage;

(...)

$stack = HandlerStack::create();
$stack->push(
  new CacheMiddleware(
    new PrivateCacheStrategy(
      new FlysystemStorage(
        new Local("/tmp/sitex")
      )
    )
  ), 
  "cache"
);


// Request
$client = new Client([
    "handler"  => $stack,
    "base_uri"  => "http://...,
    "timeout"   => 2.0,
]);

$response = $client->request("GET", "/posts", [
(...)

运行代码后,我不会收到任何错误或警告。 Guzzle仍向我提供API响应,但/tmp/sitex中没有任何新内容。

我是否需要在请求缓存响应后设置任何内容?是否有设置响应的TTL等选项?

文档没有解释任何这些,所以如果有经验的Guzzle可以帮助我,那就太好了。 :)

1 个答案:

答案 0 :(得分:6)

我设法通过将$stack->push(替换为:

来解决此问题
$stack->push(
      new CacheMiddleware(
        new GreedyCacheStrategy(
          new FlysystemStorage(
            new Local("/tmp/sitex")
          ),
          180
        )
      ), 
      "cache"
    );
  • GreedyCacheStrategy:始终缓存响应,而不检查缓存信息的标题;
  • 180是我们想要存储缓存的TTL。

同时将use Kevinrob\GuzzleCache\Strategy\PrivateCacheStrategy;替换为use Kevinrob\GuzzleCache\Strategy\GreedyCacheStrategy;