注意

本文档适用于 Ceph 的开发版本。

PHP S3 示例

安装 AWS PHP SDK

这使用 composer 安装 AWS PHP SDK(关于如何安装 composer,请参阅此处)。

$ composer install aws/aws-sdk-php

创建连接

这会创建一个连接,以便您可以与服务器交互。

注意

客户端初始化需要一个区域,因此我们使用 ''

<?php

use Aws\S3\S3Client;

define('AWS_KEY', 'place access key here');
define('AWS_SECRET_KEY', 'place secret key here');
$ENDPOINT = 'http://objects.dreamhost.com';

// require the amazon sdk from your composer vendor dir
require __DIR__.'/vendor/autoload.php';

// Instantiate the S3 class and point it at the desired host
$client = new S3Client([
    'region' => '',
    'version' => '2006-03-01',
    'endpoint' => $ENDPOINT,
    'credentials' => [
        'key' => AWS_KEY,
        'secret' => AWS_SECRET_KEY
    ],
    // Set the S3 class to use objects.dreamhost.com/bucket
    // instead of bucket.objects.dreamhost.com
    'use_path_style_endpoint' => true
]);

列出拥有的存储桶

这将获取一个 AWS\Result 实例,使用数组访问方式访问起来更方便。它还会打印出每个存储桶的名称和创建日期。

<?php
$listResponse = $client->listBuckets();
$buckets = $listResponse['Buckets'];
foreach ($buckets as $bucket) {
    echo $bucket['Name'] . "\t" . $bucket['CreationDate'] . "\n";
}

输出将类似于

mahbuckat1   2011-04-21T18:05:39.000Z
mahbuckat2   2011-04-21T18:05:48.000Z
mahbuckat3   2011-04-21T18:07:18.000Z

创建存储桶

这会创建一个名为 my-new-bucket 的新存储桶,并返回一个 AWS\Result 对象。

<?php
$client->createBucket(['Bucket' => 'my-new-bucket']);

列出存储桶内容

这将获取一个 AWS\Result 实例,使用数组访问方式访问起来更方便。然后它会打印出每个对象的名称、文件大小和上次修改日期。

<?php
$objectsListResponse = $client->listObjects(['Bucket' => $bucketname]);
$objects = $objectsListResponse['Contents'] ?? [];
foreach ($objects as $object) {
    echo $object['Key'] . "\t" . $object['Size'] . "\t" . $object['LastModified'] . "\n";
}

注意

如果此存储桶中有超过 1000 个对象,您需要检查 $objectsListResponse[‘isTruncated’] 并使用列出的最后一个键的名称再次运行。继续这样做直到 isTruncated 不为 true。

如果存储桶中包含文件,输出将类似于

myphoto1.jpg 251262  2011-08-08T21:35:48.000Z
myphoto2.jpg 262518  2011-08-08T21:38:01.000Z

删除存储桶

这会删除名为 my-old-bucket 的存储桶,并返回一个 AWS\Result 对象

注意

存储桶必须为空!否则它将无法工作!

<?php
$client->deleteBucket(['Bucket' => 'my-old-bucket']);

创建对象

这会创建一个名为 hello.txt 的对象,其字符串内容为 "Hello World!"

<?php
$client->putObject([
    'Bucket' => 'my-bucket-name',
    'Key' => 'hello.txt',
    'Body' => "Hello World!"
]);

更改对象的 ACL

这使得对象 hello.txt 可公开读取,而 secret_plans.txt 保持私有。

<?php
$client->putObjectAcl([
    'Bucket' => 'my-bucket-name',
    'Key' => 'hello.txt',
    'ACL' => 'public-read'
]);
$client->putObjectAcl([
    'Bucket' => 'my-bucket-name',
    'Key' => 'secret_plans.txt',
    'ACL' => 'private'
]);

删除对象

这会删除对象 goodbye.txt

<?php
$client->deleteObject(['Bucket' => 'my-bucket-name', 'Key' => 'goodbye.txt']);

下载对象(到文件)

这会下载对象 poetry.pdf 并将其保存在 /home/larry/documents/

<?php
$object = $client->getObject(['Bucket' => 'my-bucket-name', 'Key' => 'poetry.pdf']);
file_put_contents('/home/larry/documents/poetry.pdf', $object['Body']->getContents());

生成对象下载 URL(签名和未签名)

这会为 hello.txt 生成一个未签名的下载 URL。这之所以有效,是因为我们通过在上面设置 ACL 使 hello.txt 变为公开。然后,这会为 secret_plans.txt 生成一个签名的下载 URL,该 URL 将在 1 小时内有效。签名的下载 URL 在该时间段内即使对象是私有的也会有效(时间段结束后,URL 将停止工作)。

<?php
$hello_url = $client->getObjectUrl('my-bucket-name', 'hello.txt');
echo $hello_url."\n";

$secret_plans_cmd = $client->getCommand('GetObject', ['Bucket' => 'my-bucket-name', 'Key' => 'secret_plans.txt']);
$request = $client->createPresignedRequest($secret_plans_cmd, '+1 hour');
echo $request->getUri()."\n";

输出将类似于

http://objects.dreamhost.com/my-bucket-name/hello.txt
http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=sandboxAccessKey%2F20190116%2F%2Fs3%2Faws4_request&X-Amz-Date=20190116T125520Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=61921f07c73d7695e47a2192cf55ae030f34c44c512b2160bb5a936b2b48d923

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入