不能直接缓存百度api结果,因其响应头缺乏cache-control或expires,且需access_token或签名,导致symfony2 http缓存无效;应使用doctrine或redis在应用层手动缓存,注意键设计、ttl设置及token刷新时的缓存清理。

不能直接缓存百度API结果——因为百度API返回的响应头通常不带 Cache-Control 或 Expires,且多数接口要求每次请求携带有效 access_token 或签名,HTTP网关缓存(如Varnish、Symfony反向代理)根本不会缓存它。
为什么 Symfony2 的 HTTP 缓存对百度API无效
HTTP缓存依赖响应头中的缓存策略。百度API(如地图、翻译、OCR等)默认返回 Cache-Control: no-store, no-cache 或压根不设缓存头,加上 Set-Cookie、Vary: Authorization 等字段,导致 Symfony2 的反向代理或网关缓存直接跳过存储逻辑。
- 即使你手动在控制器里调用
Response::setPublic(),也改变不了百度服务端返回的原始响应头 - Symfony2 的
HttpCache只缓存自己应用生成的响应,不接管上游外部HTTP请求 - ESI(Edge Side Includes)也不能用于外部域名,
include src="https://api.map.baidu.com/..."会被拒绝或忽略
正确做法:用 Doctrine Cache 或 Redis 做应用层结果缓存
你需要在调用百度API的业务代码里,手动包裹一层缓存逻辑,把 JSON 响应体序列化后存进本地缓存后端。
- 优先选
cache.adapter.redis(需安装symfony/cache和ext-redis),比文件缓存快10倍以上 - 缓存键建议包含 API 路径 + 查询参数 +
access_token的哈希(避免 token 泄露到键名),例如:bdapi:geocoding:v2:sha256(地址+ak) - 设置合理 TTL:百度地理编码结果变化频率低,
3600(1小时)足够;而实时路况类接口建议300(5分钟) - 务必加异常兜底:网络超时或百度返回错误码(如
status=302)时,不要写入缓存,避免脏数据污染
示例片段:
$cache = $this->container->get('cache.app');
$key = 'bdapi:geocoding:' . hash('sha256', $address . $ak);
$data = $cache->get($key, function (ItemInterface $item) use ($address, $ak) {
$item->expiresAfter(3600);
$response = $this->httpClient->request('GET', 'https://api.map.baidu.com/geocoding/v3', [
'query' => ['address' => $address, 'ak' => $ak]
]);
$content = $response->toArray();
if (isset($content['status']) && $content['status'] !== 0) {
throw new \RuntimeException('Baidu API error: ' . $content['message']);
}
return $content;
});
绕不开的坑:access_token 刷新与缓存失效
百度 OAuth2 的 access_token 有效期普遍为 30 天,但部分接口(如 AI 平台)仅 1 小时。如果 token 过期后你还用旧 token 请求并缓存了 {"error_code":110,"msg":"access_token invalid"},后续所有请求都会命中这个错误缓存。
- 不要把 token 直接拼进缓存键——token 变更时旧键无法自动清理
- 推荐方案:缓存键中只含业务参数,token 单独管理;每次请求前先校验 token 是否过期,过期则刷新并清空所有依赖该 token 的缓存项(可用
cache.app->deleteItems($prefix)) - 更稳妥的做法是:在 token 刷新逻辑里触发事件,由监听器批量删除相关缓存,避免漏删
真正影响性能的从来不是“能不能缓”,而是“缓什么、缓多久、缓错了怎么 recover”。百度API 的响应结构稳定但权限粒度细,缓存设计必须和它的生命周期对齐,否则省下的毫秒会变成线上告警的分钟。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











