aws/aws-sdk-php是PHP对接MinIO的唯一可持续方案,因MinIO官方PHP SDK已归档;需显式配置use_path_style_endpoint=true、signature_version='s3v4'及endpoint,并推荐使用composer require aws/aws-sdk-php:^3.280版本。

aws/aws-sdk-php 是 PHP 对接 MinIO 的事实标准,但直接照搬 S3 文档会踩坑。MinIO 不是 S3,它只是兼容——协议层对齐,行为细节和默认策略却有差异。
为什么用 boto3 或 aws-sdk-php 而不是 MinIO 官方 PHP SDK?
boto3 或 aws-sdk-php 而不是 MinIO 官方 PHP SDK?MinIO 官方早已停止维护 PHP SDK(minio/minio-php 项目已归档),当前唯一可持续更新、社区支持充分、文档完整的方案就是 AWS 官方的 aws-sdk-php。
- 它原生支持
endpoint_url和path_style_access_enabled,这两项是对接 MinIO 的关键开关 - 所有 S3 API 方法(
putObject、listObjectsV2、createMultipartUpload等)在 MinIO 上均可直接调用 - 不需要额外封装或适配层,省去维护成本
composer require aws/aws-sdk-php:^3.280 是当前兼容 MinIO 最稳的版本(截至 2026 年 4 月,^3.290 已验证无 break change)
putObject 直传小文件时必须设 signature_version
putObject 直传小文件时必须设 signature_version
MinIO 默认启用 s3v4 签名,而老版本 AWS SDK(如 3.184)可能默认用 s3,导致 403 Forbidden:
立即学习“PHP免费学习笔记(深入)”;
AccessDenied: Access Denied
解决方法是在初始化 client 时显式指定:
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
$client = new S3Client([
'version' => '2006-03-01',
'region' => 'us-east-1',
'endpoint' => 'http://192.168.1.100:9000',
'use_path_style_endpoint' => true,
'credentials' => [
'key' => 'admin',
'secret' => 'admin123456',
],
'http' => ['verify' => false], // 本地测试可关 TLS 验证
'signature_version' => 's3v4', // ⚠️ 必须加这一行
]);-
use_path_style_endpoint => true:强制走<a href="https://www.php.cn/link/5aa280f5c0342b720a72b71d3b2a0cc9">https://www.php.cn/link/5aa280f5c0342b720a72b71d3b2a0cc9</a>路径格式,否则 MinIO 会拒绝virtual-hosted格式(如bucket.host:port/key) -
http.verify => false:仅限开发环境;生产务必配好 HTTPS + 有效证书,否则签名会失败
大文件分片上传要手动触发 createMultipartUpload 流程
createMultipartUpload 流程MinIO 支持标准 S3 分片上传(Multipart Upload),但不像 S3 那样自动降级:PHP SDK 的 upload 方法不会自动切片,它只对 >5GB 文件才启用分片逻辑(且依赖底层 TransferManager)。实际业务中,你很可能需要自己控制分片行为,例如:
- 前端预签名分片上传(每个分片单独请求
createMultipartUpload→ 获取 uploadId → 上传各 part →completeMultipartUpload) - 后端流式分块读取(避免
file_get_contents()把 2GB 视频全 load 进内存)
关键点:
-
createMultipartUpload返回的UploadId必须持久化(存 DB 或 Redis),因为completeMultipartUpload时必须提供全部PartNumber+ETag映射 - 每个 part 大小建议 ≥5MB(MinIO 最小分片限制),且所有 part(除最后一片)必须等长
- 若某 part 上传失败,可重传该 part,无需重传全部
示例片段(简化版):
$result = $client->createMultipartUpload(['Bucket' => 'my-bucket', 'Key' => 'video.mp4']);
$uploadId = $result['UploadId'];
// 上传第1片(伪代码,实际需 fopen + fread 分块)
$part1 = file_get_contents('/tmp/part1');
$result = $client->uploadPart([
'Bucket' => 'my-bucket',
'Key' => 'video.mp4',
'PartNumber' => 1,
'UploadId' => $uploadId,
'Body' => $part1,
]);
// complete 时传入 parts 列表
$parts = [['PartNumber' => 1, 'ETag' => $result['ETag']]];
$client->completeMultipartUpload([
'Bucket' => 'my-bucket',
'Key' => 'video.mp4',
'UploadId' => $uploadId,
'MultipartUpload' => ['Parts' => $parts],
]);MinIO 开源版已归档,minio/minio:release.2025-09-07t16-13-09z 是最后可用镜像
minio/minio:release.2025-09-07t16-13-09z 是最后可用镜像2025 年 12 月 MinIO 开源版进入维护模式,2026 年 2 月 GitHub 仓库彻底归档。这意味着:
- 不再修复新发现的安全漏洞(如 CVE-2026-xxxx 类型)
- 新功能(如 WebAssembly 插件、S3 Select 增强)仅限商业版
- 所有 Docker 镜像 tag 中,只有
minio/minio:release.2025-09-07t16-13-09z是最后一个经完整测试、含完整 S3 兼容性保障的版本
如果你正在写部署脚本或 CI/CD 流水线,务必锁定该 tag,不要用 latest 或 RELEASE.2026-xx(不存在)。
另外注意:MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 在 v2025-09-07 版本后仍有效,但控制台(:9001)已默认关闭匿名访问,必须登录才能操作 Bucket —— 这和旧版行为不同,容易误判为“服务没起来”。



















