在 PHP 中处理 S3 和云存储
兼容 Amazon S3(简单存储服务)协议的云对象存储已成为存储文件、图片、备份和静态内容的事实标准。PHP 提供了强大的工具来集成此类存储,例如 AWS S3、MinIO(自托管)、DigitalOcean Spaces、Wasabi、Yandex Object Storage 等。在本文中,我们将详细探讨如何使用官方 AWS SDK 和替代库在 PHP 中处理兼容 S3 的存储。
S3 基本概念
在进入代码之前,理解 S3 的关键概念很重要:
- 存储桶 (Bucket) — 对象(文件)的容器。存储桶名称在公共云中必须全局唯一。
- 对象 (Object) — 文件及其元数据。每个对象都有一个键 (Key) — 存储桶内的文件路径。
- 区域 (Region) — 存储的地理位置。
- 凭证 (Credentials) — 用于身份验证的访问密钥 ID 和秘密访问密钥。
- 端点 (Endpoint) — 存储的 URL(对于非 AWS 的兼容 S3 服务,端点是必需的)。
安装适用于 PHP 的 AWS SDK
用于处理 S3 的官方库是 aws/aws-sdk-php。通过 Composer 安装:
composer require aws/aws-sdk-php对于 MinIO 或 DigitalOcean Spaces,无需额外依赖 — SDK 支持自定义端点。
S3 客户端的基本配置
创建一个用于连接 AWS S3 的客户端:
<?phprequire 'vendor/autoload.php';
use Aws\\S3\\S3Client;use Aws\\Exception\\AwsException;
$s3Client = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', 'credentials' => [ 'key' => 'YOUR_ACCESS_KEY', 'secret' => 'YOUR_SECRET_KEY', ],]);?>对于 MinIO(本地兼容 S3 的存储),配置如下:
<?php$s3Client = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', // MinIO 忽略区域 'endpoint' => 'http://localhost:9000', 'use_path_style_endpoint' => true, 'credentials' => [ 'key' => 'minioadmin', 'secret' => 'minioadmin', ],]);?>请注意参数 use_path_style_endpoint — 对于 MinIO 和一些非 AWS 存储是必需的。
存储桶管理
创建存储桶
<?phptry { $result = $s3Client->createBucket([ 'Bucket' => 'my-php-bucket', ]); echo "存储桶已创建: " . $result['Location'];} catch (AwsException $e) { echo "错误: " . $e->getMessage();}?>检查存储桶是否存在
<?php$exists = $s3Client->doesBucketExist('my-php-bucket');if ($exists) { echo "存储桶存在";} else { echo "存储桶未找到";}?>列出所有存储桶
<?php$buckets = $s3Client->listBuckets();foreach ($buckets['Buckets'] as $bucket) { echo $bucket['Name'] . " (创建于: " . $bucket['CreationDate'] . ")<br>";}?>上传文件到 S3
从字符串上传(文本数据)
<?phptry { $result = $s3Client->putObject([ 'Bucket' => 'my-php-bucket', 'Key' => 'hello.txt', 'Body' => 'Hello, S3 from PHP!', ]); echo "文件已上传。URL: " . $result['ObjectURL'];} catch (AwsException $e) { echo "上传错误: "