linkorb / objectstorage
为您的云应用提供对象存储库
Requires
- php: ^7.2
- paragonie/halite: ^4
Requires (Dev)
- aws/aws-sdk-php: ^3
- friendsofphp/php-cs-fixer: ^2.15
- phpstan/phpstan: ^0.11.8
- phpunit/phpunit: ^8.1
- symfony/console: ^4
Suggests
- linkorb/bergen-client-php: To use the Bergen Adapter.
README
为您的云应用提供对象存储库。
对象存储与普通文件系统对比
对象存储解决了基于云应用的大规模存储问题。
它为基于文件系统的存储提供了一个简单的替代方案。
基于文件系统的存储问题
文件系统通常一次只能由一台服务器访问。这可以通过使用NFS、SMB等技术将文件系统暴露在网络上进行解决。这些共享技术在应用于大规模应用时存在一些局限性
- 可扩展性有限:您可以从一小组服务器挂载NFS共享,它并不适用于大量的客户端
- 单点故障:当您的NFS服务器失败时,所有的应用服务器都会失去对所有数据的访问
- 向上扩展而不是向外扩展:存储容量和性能都局限于单台机器。您可以购买更大的机器,但不能购买更多机器来分配负载(无分区)
基于对象的存储优势
基于对象的存储工作方式不同:它不支持'目录'、'文件名'等。它只知道'键'。您只需通过'键'存储原始'数据'。要将数据存储在objectstorage中,您只需写入键。要读取它,只需从键读取。没有真正的'文件名'或'目录'。这种抽象级别为您带来一系列巨大好处
- 透明分区:您可以轻松通过键对数据进行分区
- 可扩展性:您可以从任何数量的应用服务器访问数据,而不需要任何服务器挂载文件系统。它作为一个网络服务进行访问。
- 简单:与对象存储后端接口交互比文件系统接口(读取/写入/复制/重命名/mkdir/ls/rmdir等)要简单得多(get/set键)
- 灵活:由于这种简单性,实现新的物理存储后端非常容易。这使您免受次优存储解决方案的困扰。
特定的实现可能提供进一步的好处,例如'冗余'、'缓存'等。
关于这个库
此库实现了一个“服务”,该服务可以使用各种“适配器”来访问不同的“存储后端”。
目前实现了以下适配器
- S3:将您的对象存储在 Amazon S3
- GridFs:将您的对象存储在 MongoDB GridFS
- PDO:将您的对象存储在关系数据库中(用于开发/测试/调试)
- 文件:将您的对象存储在本地文件系统中(用于开发/测试/调试)
要创建自己的适配器,只需创建一个实现非常简单的 StorageAdapterInterface
类。添加对Riak CS、Google Cloud Storage等的支持非常简单。
使用示例
// Instantiate a driver of your choice (file, s3, gridfs, pdo, etc...) $adapter = ObjectStorage\Adapter\PdoAdapter::build($config); // Instantiate an ObjectStorage Service that uses the adapter instance $service = new ObjectStorage\Service($adapter); // Upload a local png into object storage $service->upload('my-photo', '/home/test/some_file.png'); // Download the image from object storage to a new local file $service->download('my-photo', '/home/test/some_file.png'); // Delete the image from object storage $service->delete('my-photo'); $message = "Hello world!"; // put the message data into object storage $service->set('my-message', $message); // read the message back from object storage $text = $service->get('my-message'); echo $text; // Outputs "Hello world!"; // Delete the message from object storage $service->delete('my-message');
加密
此库包括适配器,允许您在数据传递到存储后端之前透明地加密/解密您的数据。
这是通过将原始存储适配器(s3、文件、pdo、gridfs等)包装在加密适配器中实现的。以下是一个示例
$adapter = new \ObjectStorage\Adapter\EncryptedStorageAdapter( new \ObjectStorage\Adapter\PdoAdapter($pdo), \ParagonIE\Halite\KeyFactory::loadAuthenticationKey($pathToSigningKey), \ParagonIE\Halite\KeyFactory::loadEncryptionKey($pathToEncryptionKey) ); // You can use $adapter as before and both the storage keys and objects will be // encrypted (use PlaintextKeyEncryptedStorageAdapter if you don't want the // storage keys to be encrypted).
加密例程由 ParagonIE/Halite 和 libsodium 提供。
使用以下命令生成并保存所需的前一个示例中的签名密钥和加密密钥:-
./bin/objectstorage genkey --signing /path/to/a/file ./bin/objectstorage genkey /path/to/another/file
您还可以使用附带的加密 + 解密命令。以下示例中,我们使用 key.asc
中的加密密钥对 example.pdf
进行加密,然后再次使用相同的密钥进行解密,将其写入新的 example-new.pdf
bin/objectstorage encrypt key.asc example.pdf example.pdf.encrypted bin/objectstorage decrypt key.asc example.pdf.encrypted example-new.pdf
控制台工具
此库附带一个简单的控制台应用程序,该应用程序使用此库。您可以使用它进行测试和内省。
示例控制台命令
# Upload a file into object storage
bin/objectstorage objectstorage:upload my-photo /home/test/input.png
# Download a file from object storage
bin/objectstorage objectstorage:upload my-photo /home/test/output.png
# Delete data from object storage
bin/objectstorage objectstorage:upload my-photo
配置文件
可以使用配置文件配置控制台工具。
它将在当前目录中查找名为 objectstorage.conf
的文件。如果找不到,它将查找 ~/.objectstorage.conf
,最后查找 /etc/objectstorage.conf
。
您也可以使用选项 --config myconfig.conf
明确指定配置文件。
示例配置文件
此存储库中包含一个名为 objectstorage.conf.dist
的文件,您可以将它复制到 objectstorage.conf
并添加您自己的凭证。
此文件中的注释说明了有哪些选项可用。
功能
- PSR-0 兼容,与 composer 一起工作,并在 packagist.org 上注册
- PSR-1 和 PSR-2 编码风格级别
- 支持 Amazon S3(
S3Adapter
) - 支持 MongoDB GridFS(
GridFsAdapter
) - 通过 PDO(
PdoAdapter
)支持 MySQL、PostgreSQL、Oracle、SQLite、MS SQL Server 等 - 支持文件系统(
FileAdapter
) - 包括用于测试和内省的 CLI 工具
待办事项(欢迎 pull requests!)
- 添加对更多后端的支持(Riak CS、Google Cloud Storage 等)
- 添加客户端加密支持
- 添加按前缀列出密钥的支持(仅在选定的驱动程序上)
安装
有关安装和运行 composer 的详细信息,请参阅 composer。
然后,将 linkorb/objectstorage
添加到项目的 composer.json
中
{ "require": { "linkorb/objectstorage": "^4.0" } }
此库的旧版本
版本 1.0,之前仅作为 dev-master 提供,通过将 composer.json 更新为需要版本 "~1.0" 仍然可用。
php5
分支仍然可以与 PHP <= 5.6 一起工作,但它不会有最新的功能,特别是如果您需要加密存储,则不应使用它。
贡献
准备好构建并改进此存储库?太棒了!请先进行 fork/clone 此存储库,我们期待您的 pull requests!
如果您无法自己实现您喜欢的更改,请毫不犹豫地打开一个新的问题报告,以便我们或其他人可以处理它。
由 LinkORB 工程团队提供
请访问 linkorb.com/engineering 了解我们的其他项目。
顺便说一句,我们正在招聘!
许可
请参阅 LICENSE.md 以获取完整的许可信息