【问题标题】:PHP: Guzzle 6 + Guzzle-cache-middlewarePHP:Guzzle 6 + Guzzle-cache-middleware
【发布时间】:2016-09-19 13:44:37
【问题描述】:

我有一个页面使用 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 之类的选项?

文档对如何实现这一点不是很清楚,所以如果有经验的人可以帮助我,那就太好了。 :)

【问题讨论】:

  • 我发现使用 PublicCacheStrategy 更好地缓存实现正确缓存标头的服务器响应

标签: php caching guzzle guzzle6


【解决方案1】:

我设法通过将$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;

【讨论】:

  • 谢谢您,我只是在正确设置简单文件系统缓存以使其正常工作时遇到了困难,这就是那个。
猜你喜欢
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2016-04-27
  • 2020-05-08
  • 2019-12-25
  • 1970-01-01
  • 2019-08-26
  • 2016-10-05
相关资源
最近更新 更多