在 PHP 中处理 S3 和云存储:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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 "上传错误: "                    

推荐