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
相关产品推荐
相关产品推荐

