phlib/flysystem-pdo

使用PDO在数据库中存储文件的Flysystem适配器

2.1.0 2022-09-01 06:29 UTC

This package is auto-updated.

Last update: 2024-09-03 08:50:04 UTC


README

Code Checks Codecov Latest Stable Version Total Downloads Licence

这是League的Flysystem的PDO适配器。

  • 使用多个表。
  • 以块的形式存储文件。
  • 在存储时可以选择压缩文件。

此实现针对使用流的大文件进行了优化。它避免了将整个文件加载到内存中,而是选择在本地文件系统上操作时存储文件。

用法

use Phlib\Flysystem\Pdo\PdoAdapter;
use League\Flysystem\Filesystem;

$pdo        = new \PDO('mysql:host=hostname;dbname=database_name', 'username', 'password');
$adapter    = new PdoAdapter($pdo);
$filesystem = new Filesystem($adapter);

writewriteStream上的配置

use League\Flysystem\Config;

$config = new Config([
    'enable_compression' => false,
    'visibility'         => AdapterInterface::VISIBILITY_PUBLIC
]); 
$adapter->writeStream('/path/to/file.zip', $handle, $config);

适配器配置

示例

use League\Flysystem\Config;

$config = new Config([
    'table_prefix'            => 'flysystem',
    'enable_compression'      => true,
    'chunk_size'              => 1048576,
    'temp_dir'                => '/var/tmp',
    'disable_mysql_buffering' => true
]);
$adapter = new PdoAdapter($pdo, $config);

文件配置

以下可选文件配置补充了标准行为。示例模式包括列,但它们是可选的,可能被省略。

过期时间

在写入或更新文件时指定'expiry'作为配置参数,PdoAdatper会将值存储在名为'expiry'的列中。当选择文件信息时,如果存在过期时间并且可以通过strtotime解析,则将评估过期时间。如果文件不存在或已过期,则返回False。

示例

$config = new Config(['expiry' => date('Y-m-d H:i:s', strtotime('+2 days'))]);
$adapter->write($path, $content, $config);

过期时间现在是文件描述的一部分。

$data = $adapter->getMetadata($path);
[
    'path' => '...',
    '...',
    'expiry' => ''
]

附加元数据

可以存储有关文件或目录的附加元数据。这可能包括所有者、权限或组等。信息以您提供的任何形式存储为JSON编码的字符串。从文件系统检索项目后,以相同的格式提供附加元信息。

示例

$config = new Config(['meta' => ['owner' => 'John Smith', 'permissions' => 600]]);
$adapter->write($path, $content, $config);

这些详细信息现在是文件描述的一部分。

$data = $adapter->getMetadata($path);
[
    'path' => '...',
    '...',
    'meta' => [
        'owner' => 'John Smith',
        'permissions' => 600
    ]
]

模式

模式可在模式目录中找到。可以根据需求更改特定类型。所有字段名称都应保持相同。以下是对特定于数据库的定义的说明。

MySQL说明

  • path列设置为最多允许255个字符。
  • size列设置为无符号INT类型,以便于搜索。这允许记录高达4G的文件。如果不需要搜索,则可以将其更改为VARCHAR
  • 块的大小允许每个块高达16M。

内存使用(以及注意事项)

使用大文件进行任何readwriteupdate操作都会导致内存使用问题。相关的流方法已优化以尽可能少地使用内存。适配器首先将文件保存到本地文件系统,然后再将其传输到数据库。

缓冲

在MySQL中,默认行为是缓冲所有查询结果。从数据库中读取文件时,这可能会导致内存问题。有一个配置选项可以禁用缓冲。副作用是构造函数中指定的pdo连接被更改以设置此属性。

压缩

压缩在存储基于文本的文件时特别有用。压缩选项默认为开启。副作用是,在读取文件时,某些文件可能会导致比预期更大的内存使用。例如,一个填充了单个字母'a'的非常大的文件可以压缩成非常小的尺寸。当读取该文件时,这个小块会被展开并填充内存。

当文件存储时,压缩设置会与其一起存储。这不能更改。

分块处理

分块处理已经实现,以帮助设置复制系统的场景。这里需要考虑数据包的大小。

许可证

此软件包是免费软件:您可以在自由软件基金会发布的GNU较小通用公共许可证的条款下重新分发和/或修改它,无论是许可证的第3版,还是(根据您的选择)任何更新的版本。

此程序的分发是希望它将是有用的,但没有任何保证;甚至没有关于其商业性或特定用途适用性的暗示性保证。有关详细信息,请参阅GNU较小通用公共许可证。

您应该已经收到随此程序一起提供的GNU较小通用公共许可证副本。如果没有,请参阅https://gnu.ac.cn/licenses/