华为云OBS PHP SDK正确安装方式为:composer require huaweicloud/huaweicloud-sdk-php-obs:3.23.12,需引入vendor/autoload.php、启用ext-curl和ext-json扩展,并使用use Obs\ObsClient;命名空间;上传音频遇403需检查时钟同步、region匹配、AK/SK权限及签名时间戳。

华为云OBS SDK安装失败或找不到ObsClient
直接用composer require huaweicloud/huaweicloud-sdk-php-obs大概率会报错,因为官方SDK已废弃,新版本统一归入huaweicloud/huaweicloud-sdk-php,但OBS模块需单独引入。正确做法是:
- 运行
composer require huaweicloud/huaweicloud-sdk-php-obs:3.23.12(注意指定兼容PHP 7.4+的稳定版,新版3.24+要求PHP 8.1) - 确认
vendor/autoload.php已引入,且项目未禁用ext-curl或ext-json - 若提示
Class 'Obs\ObsClient' not found,检查命名空间是否写成use Obs\ObsClient;(不是use HuaweiCloud\SDK\Obs\ObsClient)
ObsClient::putObject()上传音频时返回403或签名错误
华为云OBS对请求头、时间戳、签名算法极其敏感,常见于本地时钟不同步或region填错。关键点:
-
region必须与桶所在区域完全一致,例如华东-上海二:填cn-east-2,不能写east-2或cn-east2 - 确保
$config['ak']和$config['sk']是IAM用户密钥,且该用户有OBS Bucket PutObject权限(不是仅控制台登录权限) - 上传前用
date -R核对服务器时间,误差超过15分钟必然403;PHP里可用date_default_timezone_set('UTC')强制对齐 - 音频文件路径必须是服务端可读的绝对路径,
$_FILES['audio']['tmp_name']可直接传,但别漏掉is_uploaded_file()校验
上传大音频文件(>100MB)卡住或超时
OBS默认putObject走单次HTTP PUT,不适用于大文件。必须切分上传:
- 小文件(≤5MB):直接
$obsClient->putObject($bucket, $key, $filePath) - 中等文件(5–100MB):启用分段上传,先
$obsClient->initiateMultipartUpload(),再循环uploadPart(),最后completeMultipartUpload() - 大文件(>100MB):务必设置
streamingUpload为true,并调大PHP配置:max_execution_time = 0、default_socket_timeout = 300、post_max_size = 200M - 音频格式本身不影响上传逻辑,但建议在
$metadata['ContentType']里显式设为audio/mpeg(MP3)或audio/wav,避免浏览器下载时乱解析
如何生成带过期时间的音频直链(供前端播放)
OBS默认上传对象是私有,不能直接<audio src="xxx"></audio>。要生成临时URL:
立即学习“PHP免费学习笔记(深入)”;
- 用
$obsClient->createSignedUrl(),传入expires参数(单位秒),例如3600表示1小时 - 注意
method必须是GET,bucket和key必须与上传时完全一致(区分大小写、编码) - 生成的URL含
Expires、AccessKeyId、Signature三段,其中Signature由SDK自动计算,勿手动拼接 - 若前端播放报
CORS error,需到OBS控制台为桶配置CORS规则,允许GET方法及你的域名
createSignedUrl()生成的链接就立刻失效。调试时先用curl -v抓包看Date头是否UTC格式,再比对华为云控制台里的“请求时间”字段。



















