You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Guzzle7 集成guzzle-cache-middleware缓存目录无内容问题求解

问题根因

你的配置存在三处核心错误,导致缓存无法落地:

  • 中间件注册参数错误:HandlerStack::push()的第二个参数是中间件别名,不是缓存存储路径,你填写的目录路径在这里不生效
  • 未配置持久化存储:CacheMiddleware默认使用内存级的ArrayCache,请求进程结束后缓存就销毁,不会写入磁盘
  • 公共缓存策略不兼容认证请求:默认的公共缓存策略会跳过带Authorization头的请求(你的基础认证会携带该头),不会触发缓存写入

修正方案

首先安装依赖的文件缓存适配器:

composer require symfony/cache

然后修改后的代码如下:

$userName = "xxxxxxx";
$password = "yyyyyyyyyyy";
require_once './vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use Kevinrob\GuzzleCache\CacheMiddleware;
use Kevinrob\GuzzleCache\Strategy\PrivateCacheStrategy;
use Kevinrob\GuzzleCache\Storage\SymfonyCacheStorage;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

$stack = HandlerStack::create();
// 1. 实例化文件系统缓存,指定缓存目录、缓存有效期
$cacheStorage = new SymfonyCacheStorage(
    new FilesystemAdapter('guzzle_cache', 3600, '/home/xxxx/xxxxx/guzzle2/cache')
);
// 2. 使用私有缓存策略(支持缓存带认证的请求)+ 持久化存储初始化中间件
$cacheMiddleware = new CacheMiddleware(
    new PrivateCacheStrategy($cacheStorage)
);
// 3. 注册中间件,第二个参数是别名可以自定义
$stack->push($cacheMiddleware, 'cache');

$client = new Client([
    'handler'   => $stack,
    'base_uri'  => 'https://api.xxxxx.com/xxx/',
    "timeout"   => 30.0,
]);
$json = $client->get('zzzzzz.json', [
            'auth' => [
                $userName, 
                $password
            ]
]);
var_dump($json->getHeaderLine(CacheMiddleware::HEADER_CACHE_INFO));

额外注意事项

  • 确保你填写的缓存目录/home/xxxx/xxxxx/guzzle2/cache存在,且给PHP运行用户(比如www-data、apache)分配读写权限
  • 首次请求返回MISS属于正常现象,第二次发起相同请求时会返回HIT,此时缓存目录会生成对应的缓存文件

内容的提问来源于stack exchange,提问作者A973C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:45:04