飞行的蜗牛

vuePress-theme-reco 极客学长    2013 - 2025
飞行的蜗牛 飞行的蜗牛

Choose mode

  • dark
  • auto
  • light
首页
分类
  • 技术杂谈
  • Database
  • Docker
  • PHP
  • 随笔杂谈
  • 前端开发
  • FunnyTools
  • Jekyll
  • 读书笔记
  • Java
  • SpringBoot
  • 区块链技术
  • IPFS
  • C/C++
  • Filecoin
  • Golang
  • Sharding-JDBC
  • 分布式存储
  • Lotus-源码系列
  • Lotus
  • 框架源码系列
  • Spring-源码系列
  • AI
  • ChatGPT
  • Stable Diffusion
  • DeepSeek-R1
  • DeepSeek-V3
标签
时间抽
关于作者
开源项目
GeekAI (opens new window)
author-avatar

极客学长

154

文章

151

标签

首页
分类
  • 技术杂谈
  • Database
  • Docker
  • PHP
  • 随笔杂谈
  • 前端开发
  • FunnyTools
  • Jekyll
  • 读书笔记
  • Java
  • SpringBoot
  • 区块链技术
  • IPFS
  • C/C++
  • Filecoin
  • Golang
  • Sharding-JDBC
  • 分布式存储
  • Lotus-源码系列
  • Lotus
  • 框架源码系列
  • Spring-源码系列
  • AI
  • ChatGPT
  • Stable Diffusion
  • DeepSeek-R1
  • DeepSeek-V3
标签
时间抽
关于作者
开源项目
GeekAI (opens new window)
  • Ceph-09 使用 PHP 操作 Ceph S3 接口

    • 安装 AWS PHP SDK
      • 建立连接
        • 获取 Bucket 列表
          • 创建一个 Bucket
            • 删除一个 Bucket
              • 获取文件列表
                • 上传文件
                  • 删除文件
                    • 下载文件
                      • 生成文件下载地址
                        • 参考文档

                        Ceph-09 使用 PHP 操作 Ceph S3 接口

                        vuePress-theme-reco 极客学长    2013 - 2025

                        Ceph-09 使用 PHP 操作 Ceph S3 接口


                        极客学长 2020-10-19 0 Ceph

                        岸见一郎 -- 被讨厌的勇气

                        这个世界世界给了你什么,那是你决定不了的。但是怎么看待,怎么利用你手里的东西,确是你可以决定的。

                        本文我们接着上文继续来探讨一下如何使用使用 PHP 来操作 Ceph S3 接口。

                        # 安装 AWS PHP SDK

                        很简单,直接使用 composer 安装就好了。

                        composer install aws/aws-sdk-php
                        

                        你也可以直接新建 composer.json 文件,然后加上如下配置:

                        {
                            "require": {
                                "aws/aws-sdk-php": "^3.154"
                            }
                        }
                        

                        然后再执行:

                        composer update
                        

                        # 建立连接

                        use Aws\S3\S3Client;
                        
                        define('AWS_KEY', 'MTAU54XU6ILI6097SNK8');
                        define('AWS_SECRET_KEY', 'TfYnLGXnOsQ6eXd8j98T3zYlwoewDFwTRwhqygFU');
                        define('DOMAIN', 'http://s3.rockyang.org');
                        
                        require __DIR__.'/vendor/autoload.php';
                        
                        // Instantiate the S3 class and point it at the desired host
                        $client = new S3Client([
                            'region' => '',
                            'version' => '2012-10-17',
                            'endpoint' => DOMAIN,
                            '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
                        ]);
                        

                        # 获取 Bucket 列表

                        该 API 将返回一个 AWS\Result 对象。

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

                        输出:

                        bucket1   2020-10-19T22:05:39.000Z
                        bucket1   2020-10-19T22:05:48.000Z
                        bucket1   2020-10-19T22:07:18.000Z
                        

                        # 创建一个 Bucket

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

                        # 删除一个 Bucket

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

                        # 获取文件列表

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

                        # 上传文件

                        上传一个文本文件:

                        $client->putObject([
                            'Bucket' => 'my-bucket-name',
                            'Key' => 'hello.txt',
                            'Body' => "Hello World!" // 文件内容
                        ]);
                        

                        上传一个二进制文件:

                        $sourceFile = "hello.jpg";
                        $r = $client->putObject([
                            'Bucket' => 'my-bucket-name',
                            'Key' => 'hello.jpg',
                            'SourceFile' => $sourceFile
                        ]);
                        $r = $r->toArray();
                        $res = $r['@metadata'];
                        if (isset($res["statusCode"]) && $res["statusCode"] == 200) {
                            printf("Upload successfully. url: %s\n", $r["ObjectURL"]);
                        } else {
                            echo "File upload failed.\n";
                        }
                        

                        # 删除文件

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

                        # 下载文件

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

                        # 生成文件下载地址

                        $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
                        

                        # 参考文档

                        • https://docs.ceph.com/en/latest/radosgw/s3/php/ (opens new window)

                        本站博文如非注明转载则均属作者原创文章,引用或转载无需申请版权或者注明出处,如需联系作者请加微信: geekmaster01

                        Ceph-08 搭建 Ceph S3 对象存储服务 从零开始搭建 Filecoin 主网挖矿集群[持续更新]