phlib / flysystem-pdo
使用PDO在数据库中存储文件的Flysystem适配器
Requires
- php: ^7.4 || ^8.0
- ext-json: *
- ext-pdo: *
- ext-zlib: *
- league/flysystem: ^1.0
Requires (Dev)
README
这是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);
在write
和writeStream
上的配置
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。
内存使用(以及注意事项)
使用大文件进行任何read
、write
或update
操作都会导致内存使用问题。相关的流方法已优化以尽可能少地使用内存。适配器首先将文件保存到本地文件系统,然后再将其传输到数据库。
缓冲
在MySQL中,默认行为是缓冲所有查询结果。从数据库中读取文件时,这可能会导致内存问题。有一个配置选项可以禁用缓冲。副作用是构造函数中指定的pdo连接被更改以设置此属性。
压缩
压缩在存储基于文本的文件时特别有用。压缩选项默认为开启。副作用是,在读取文件时,某些文件可能会导致比预期更大的内存使用。例如,一个填充了单个字母'a'的非常大的文件可以压缩成非常小的尺寸。当读取该文件时,这个小块会被展开并填充内存。
当文件存储时,压缩设置会与其一起存储。这不能更改。
分块处理
分块处理已经实现,以帮助设置复制系统的场景。这里需要考虑数据包的大小。
许可证
此软件包是免费软件:您可以在自由软件基金会发布的GNU较小通用公共许可证的条款下重新分发和/或修改它,无论是许可证的第3版,还是(根据您的选择)任何更新的版本。
此程序的分发是希望它将是有用的,但没有任何保证;甚至没有关于其商业性或特定用途适用性的暗示性保证。有关详细信息,请参阅GNU较小通用公共许可证。
您应该已经收到随此程序一起提供的GNU较小通用公共许可证副本。如果没有,请参阅https://gnu.ac.cn/licenses/。