nvahalik/laravel-filer

在Laravel中对Flysystem的高级包装。

1.0.0 2023-01-24 17:52 UTC

This package is auto-updated.

Last update: 2024-09-07 07:52:41 UTC


README

该项目是为了满足我们不断增长的Laravel网站的需求而开始的。

  • 所有文件的元数据都存储在本地仓库中 - 支持的后端系统包括 jsondatabasememory(用于测试)。这是为了加速某些操作,这些操作通常需要调用远程文件系统。
  • 回退到原始磁盘 - 如果你提供了一个“原始磁盘”列表,此适配器将尝试从那些原始磁盘导入数据到元数据仓库。
  • 可插拔策略 - 虽然当前版本只提供了一种策略,但你可以用 Basic 实现,允许1 + 异步、镜像或其他与后端存储适配器的交互。
  • 管理数据 + 文件 - 即将推出:查询和管理元数据,以执行以下操作
    • 找到存储在单个服务上的文件并镜像它们
    • 在保持连续性的同时迁移文件之间的存储
  • 从元数据中抽象数据 - 计划在某个时候允许诸如去重和写时复制等操作,以使复制、重命名和删除操作更好地工作。

入门

要开始使用,请要求项目。

Laravel 7, 8(Flysystem V1)

composer require nvahalik/laravel-filer@^1

Laravel 9(Flysystem V3)

composer require nvahalik/laravel-filer@dev-laravel-9

完成后,您需要编辑filer配置文件,然后更新您的文件系统配置。

配置文件

默认情况下,元数据存储在JSON文件中。您可以通过编辑 config/filer.php 来更改默认存储机制,从 json 更改为 databasememory。注意,memory实际上是一个null适配器。JSON适配器包装memory,并在每次操作后进行序列化和保存。

文件系统配置

配置与其它磁盘非常相似

'example' => [
    'driver' => 'filer',
    'original_disks' => [
        'test:s3-original',
    ],
    'id' => 'test',
    'disk_strategy' => 'basic',
    'backing_disks' => [
        'test:s3-new',
        'test:s3-original',
    ],
    'visibility' => 'private',
],

original_disks 是一个选项,如果你正在从现有磁盘迁移到filer系统。实际上,这是一个回退,以便在本地元数据存储中找不到的文件将在 original_disks 中搜索。如果找到,将导入其元数据。如果没有找到,该文件将被视为丢失。我们将在稍后介绍如何进行元数据的批量导入。

注意:这将减慢文件系统的速度,直到缓存填满。一旦加载了缓存,您可以移除这些原始磁盘,并且查找文件的额外操作将被消除。

注意2:真正的丢失文件不会进行缓存。因此,如果文件丢失,并且您反复尝试断言其存在,它将反复搜索。这可以通过缓存结果或类似的 missing-files 缓存来改进。

id 只是元数据存储的内部ID。不允许在单个 id 的元数据内存在文件重复,例如,但对于不同的 id,则是允许的。

disk_strategy 目前只有一个选项: 'basic',但将是可插拔的,允许添加和使用不同的策略。basic 策略只是将数据写入提供的 backing_disks 列表中的第一个磁盘。

backing_disks 允许您定义多个 flysystem 磁盘以使用。想要使用多个与 S3 兼容的适配器?您可以。请注意,对于基本适配器,磁盘的顺序决定了尝试它们的顺序。

一些示例

给定上述配置,如果运行以下代码

Storage::disk('example')->has('does/not/exist.txt');
  1. 将搜索现有的元数据存储库。
  2. 然后,将搜索单个 'original_disks'。
  3. 最后,操作将失败。
Storage::disk('example')->put('does/not/exist.txt', 'content');
  1. 将搜索现有的元数据存储库。
  2. 然后,将搜索单个 'original_disks'。
  3. 然后,将在 test:s3-new 上尝试写入。
  4. 如果失败,则将在 test:s3-original 上尝试写入。
  5. 如果任何写入成功,将返回该适配器的后端信息,并更新条目元数据。
  6. 如果任何一个失败,则返回 false,并且操作将失败。

导入元数据

如果您已经在 S3 上有很多文件,可以使用 filer:import-s3-metadata 命令将数据导入到您的元数据存储库中

# Grab the existing contents.
s3cmd ls s3://bucket-name -rl > s3output.txt

# Import that data into the "example" storageId.
php artisan filer:import-s3-metadata example s3output.txt

导入器使用 File::lines() 加载数据,因此不会消耗太多内存。此外,它将查看 URL 中的存储桶名称,该 URL 存在于输出中,并尝试在您现有的文件系统配置中找到它。

可见性

默认情况下,它将从此处获取文件系统配置。如果没有找到或未提供 --visibility,则默认为 private

文件名剥离

您可以通过指定 --strip 选项从文件名中剥离字符串。

磁盘

如果您需要直接指定磁盘或想要以其他方式覆盖它,只需使用 --disk 传递它即可。这不会进行检查,所以不要弄错。

示例

php artisan filer:import-s3-metadata example s3output.txt --disk=some-disk --visibility=public --strip=prefix-dir/ 

上述命令将从导入的 URL 中剥离 prefix-dir/,将它们的可见性设置为公共,并将它们的默认后端磁盘标记为 some-disk