“SignatureDoesNotMatch”错误主因是系统时间偏移超15分钟或region不匹配;需校准NTP时间、确认密钥有效、初始化时严格匹配Bucket地域;大文件须用upload方法分片上传,中文key需URL编码,上线前检查HTTPS/TLS及内网endpoint配置。

cos\_php SDK 安装后 putObject 报错 “SignatureDoesNotMatch”
这基本是签名失效或时间偏移导致的,不是密钥填错了——腾讯云 COS 要求本地系统时间与 NTP 时间误差不超过 15 分钟。SDK 默认用本地时间生成签名,一旦差太多,服务端直接拒收。
- 先执行
ntpdate -q pool.ntp.org(Linux/macOS)或检查 Windows 时间服务是否启用 - 确认
SecretId和SecretKey是「访问管理 > API 密钥管理」里新建的,不是旧账号的遗留密钥(旧密钥可能被禁用或权限不足) - 初始化
CosClient时别漏掉region参数,比如广州是ap-guangzhou,写成gz或空字符串都会触发签名校验失败
上传大文件(>5MB)时卡住或内存爆掉
直接用 putObject 传大文件会把整个文件读进内存再发请求,PHP 内存限制一到就 Fatal error: Allowed memory size exhausted。必须切片上传。
- 改用
uploadPart+initiateMultipartUpload+completeMultipartUpload流程,SDK 已封装为upload方法(注意不是putObject) - 调用
$cosClient->upload($bucket, $key, $localFilePath)即可自动分片,SDK 默认按 5MB/片,支持断点续传 - 如果必须手动控制分片大小,传入
['partSize' => 10 * 1024 * 1024](10MB),但别设太小(
上传后文件在控制台显示乱码或无法预览
本质是 ContentType 没设对,浏览器不知道怎么解析内容。COS 不会自动识别文件类型,全靠你传的 Content-Type 头。
把一个已有 git 仓库装配成"TAPD 故事 → feature 分支 → PR → CNB AI 代码评审 → 合入 main → TAPD 故事自动回写 commit"的闭环工程挽具(harness)。适用于腾讯云 CNB(cnb.cool)+ TAPD 组合的团队。触发场景:(1) 用户要求把 git 仓库接入 CNB 和/或 TAPD;(2) 要求 commit/PR 自动关联 TAPD 故事;(3) 要求启用 CNB AI 代码评审(cnbcool/ai-review);(
- 上传时显式指定
ContentType:putObject的$options数组里加'ContentType' => 'image/jpeg' - 常见类型别硬背:图片用
mime_content_type($filePath)动态获取;JSON 文件必须是application/json,不是text/plain - 中文文件名要 URL 编码后再作为
$key,否则控制台列表里显示为%E4%BD%A0%E5%A5%BD.jpg是正常现象,不影响访问,但别在key里混用未编码的中文和特殊符号(如\、?)
本地测试 OK,上线后 putObject 一直超时
大概率是服务器出方向被拦截了——腾讯云 COS 的 endpoint 域名(如 cos.ap-guangzhou.myqcloud.com)走的是 HTTPS,需要确保 PHP 的 cURL 支持 TLS 1.2+,且没被公司防火墙或安全组策略屏蔽。
立即学习“PHP免费学习笔记(深入)”;
- 用
curl -I https://cos.ap-guangzhou.myqcloud.com在服务器终端直连测试,看是否能通 - 检查 PHP 是否禁用了
allow_url_fopen或 cURL 扩展未启用(php -m | grep curl) - 如果用的是内网 COS(如 CVM 和 COS 同地域),把 endpoint 换成内网地址
cos-internal.ap-guangzhou.myqcloud.com,延迟更低且不走公网流量
最常被忽略的一点:COS 的 Bucket 名称必须全局唯一,且创建时选的地域(region)和代码里初始化客户端时填的 region 必须完全一致,字母大小写都不能错——比如控制台建的是 ap-beijing,代码写了 ap-beiJing,上传永远 403 或超时。


















