PHP调用CDN刷新接口前必须确认三件事:一是厂商是否开放对应API,二是使用API密钥对而非控制台账号,三是目标URL域名已在白名单中;否则易返回InvalidDomain.NotFound或静默失败。

PHP 调用 CDN 刷新接口前必须确认的三件事
CDN 刷新失败,90% 是卡在认证或参数上,不是代码写得不对。先核对你用的 CDN 厂商是否开放了刷新 API(如阿里云 RefreshObjectCaches、腾讯云 PurgePathCache、又拍云 /purge),再确认你拿到的是「API 密钥对」而非控制台登录账号,最后检查目标 URL 是否在该账号的加速域名白名单里——否则返回 InvalidDomain.NotFound 或静默失败。
常见错误现象:403 Forbidden 多是签名过期或 Authorization 头拼错;400 Bad Request 常因 URL 未做 urlencode 或路径没加协议头(如传 /static/js/app.js 而非 https://cdn.example.com/static/js/app.js)。
用 cURL 发起带签名的刷新请求(以阿里云为例)
阿里云要求所有请求带 X-Ca-Nonce、X-Ca-Timestamp 和 Authorization 三类 Header,不能只靠 file_get_contents 简单 POST。签名逻辑虽复杂,但官方 SDK(aliyun-openapi-php-sdk)已封装好,推荐直接用:
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ServerException;
AlibabaCloud::accessKeyClient('your-access-key', 'your-access-secret')
->regionId('cn-hangzhou')
->asDefaultClient();
try {
$result = AlibabaCloud::rpc()
->product('Cdn')
->version('2018-05-10')
->action('RefreshObjectCaches')
->method('POST')
->options([
'query' => [
'ObjectPath' => 'https://cdn.example.com/static/v2.3.1/app.css',
'ObjectType' => 'File'
]
])
->request();
echo $result->toArray()['RefreshTaskId'];
} catch (ServerException $e) {
echo $e->getErrorMessage(); // 如 "Specified ObjectPath is not under your domain"
}
注意点:
立即学习“PHP免费学习笔记(深入)”;
-
ObjectPath必须是完整 HTTPS URL,且域名需已在 CDN 控制台添加并备案 - 单次最多提交 1000 个 URL,超量会返回
TooManyObjects - 免费套餐默认 100 次/日,刷多了会触发
Throttling错误
资源构建后自动触发刷新:钩子怎么接才不丢任务
不要在 git push 后直接调用刷新脚本——网络超时或 CDN 接口限流会导致刷新失败且无重试。稳妥做法是把刷新任务写入队列,由独立进程消费:
构建脚本末尾加一行:
echo "{\"url\":\"https://cdn.example.com/static/".date('Y.m.d.His').".js\"}" >> /tmp/cdn-purge-queue.json
另起一个守护进程(如用 supervisord 管理)持续读取该文件,每次取 20 行,合并为批量刷新请求,失败则 sleep 30 秒后重试。关键逻辑在于:不依赖构建环境网络稳定性,失败可追溯,且避免高频触发限流。
容易踩的坑:
- 用
file_put_contents追加日志但没加LOCK_EX,多进程写入导致 JSON 格式损坏 - 刷新脚本没判断 CDN 返回的
TaskStatus字段,误以为Accepted就等于完成 - 静态资源路径含哈希(如
app.a1b2c3.js),但构建脚本没提取新文件名,仍刷旧路径
本地开发时绕过 CDN 缓存的临时方案
调试阶段不需要真调 CDN 接口,改 Host 或加请求头更高效:
- 在
/etc/hosts把cdn.example.com指向源站 IP,彻底跳过 CDN - 给所有资源 URL 加时间戳参数:
&v=<?php echo time(); ?>(仅限开发环境,上线前删掉) - Chrome 开发者工具里勾选
Disable cache,并确保 Network 面板没勾Online模拟弱网
真正上线前务必关掉这些,否则用户看到的永远是“最新版”,而 CDN 实际没更新,反而造成资源加载失败。
CDN 刷新不是“一锤子买卖”,核心在于路径准确性、签名有效性、失败可重试。最常被忽略的是:没验证刷新任务是否真正生效——建议刷新后立即用 curl -I https://cdn.example.com/xxx.js 看 X-Cache: HIT 是否变成 MISS,再等几秒重查,确认回源成功。



















