我们的项目是一个快速发展的在线教育平台,需要存储大量的课程视频、课件和用户上传的资料。起初,我们使用的是传统的 s3 服务,但随着用户数量的增加,存储成本和访问延迟逐渐成为瓶颈。这时,我们了解到 ceph rados gateway,一个高性能、可扩展且成本效益高的 s3 兼容对象存储。
然而,将 Rados Gateway 集成到 laravel 中却并非一帆风顺。Laravel 的原生 S3 驱动程序无法直接与 Rados Gateway 兼容。我们需要找到一种方法来桥接两者之间的差异。在一番搜索后,我找到了 exula/laravel-storage-rados-s3 这个扩展库,它完美地解决了这个问题。
这个库基于 League Flysystem 的 S3 适配器,并对其进行了扩展,使其能够轻松地指向 Rados Gateway。安装过程非常简单,只需要使用 composer:
composer require exula/laravel-storage-rados-s3
Laravel 5.5 及以上版本会自动发现这个服务提供商。对于更早的版本,需要在 config/app.php 中手动注册服务提供商:
'providers' => [ // ... ExulaCephCephStorageServiceProvider::class,]
接下来,我们需要在 config/filesystems.php 中配置一个新的磁盘驱动器,指向我们的 Rados Gateway:
'ceph' => [ 'base_url' => env('CEPH_BASE_URL', 'xxxxxxxxx'), 'driver' => 'ceph', 'key' => env('CEPH_Access_KEY', 'xxxxxxx'), 'secret' => env('CEPH_SECRET_KEY', 'xxxxxxx'), 'region' => '', 'bucket' => env('CEPH_BUCKET', 'test'), 'version' => env('CEPH_VERSION', 'latest'), 'ACL' => env('CEPH_ACL', 'private'), 'visibility' => env('CEPH_VISIBILITY', 'private')],
最后,在 .env 文件中配置相应的环境变量,例如 CEPH_BASE_URL、CEPH_ACCESS_KEY、CEPH_SECRET_KEY 等。
配置完成后,我们就可以像使用其他 Laravel 存储驱动程序一样使用 ceph 磁盘了。例如,上传文件:
Storage::disk('ceph')->put('myfile.txt', 'File contents');
下载文件:
$contents = Storage::disk('ceph')->get('myfile.txt');
exula/laravel-storage-rados-s3 库极大地简化了我们在 Laravel 中使用 Rados Gateway 的过程。它不仅解决了兼容性问题,还提供了一种便捷的方式来管理对象存储,提高了开发效率。通过使用这个库,我们成功地将存储成本降低了 50%,并且显著提升了文件的访问速度。 这使得我们的平台能够更好地应对日益增长的用户需求,并为未来的扩展提供了坚实的基础。 如果你也面临着类似的存储挑战,我强烈推荐你尝试一下这个库。