ticaje/solid-file-manager

这是一个用于PHP文件交互的API

1.0.6 2021-09-17 08:53 UTC

This package is auto-updated.

Last update: 2024-09-17 15:34:04 UTC


README

这个库是一个文件管理的API,用于简单使用,当涉及大文件管理时具有方向性。

GPLv3 License Latest Version on Packagist Quality Score Total Downloads Blog

前言

传统上处理大文件变成了一场噩梦,尤其是读取它们,因为它在我们的系统中带来了一种瓶颈。我已经通过创建一个基于六边形设计和S.O.L.I.D原则的API来解决这个问题,该API允许开发者只需几个步骤就可以异步高效地使用现代技术读取大文件。

安装

您可以使用composer(我唯一推荐的方法)安装此包

composer require ticaje/solid-file-manager

这个库有什么特别之处?

此库可以使用独立项目、DI框架或更高层次的平台(如Symfony或Laravel)进行包含;无论任何上下文,它都将默认使用松耦合方法工作。我将通过一个示例来解释它是多么容易工作。

真实世界示例

想象一下,你有一个大XLSX文件需要读取,但不需要中断你的应用程序,因为你只需要从浏览器中读取它的前五行,但文件太大。这听起来很奇怪,但这是我现实生活中遇到的事情。正如你所想象的,通过PHP中提供的标准方法读取文件并不能解决这个问题,因为会有一个你无法承受的时间延迟,因为你正在浏览器中,你的应用程序可能会崩溃。实现这一点的魔力在于使用生成器,它允许你迭代数据,而无需在内存中构建数组,因为它使用通过引用提供的数据,这可以理解为异步数据处理或至少按需。

独立实例化

<?php
declare(strict_types=1);

use Ticaje\FileManager\Implementors\Reader\File\BoxSpout\Xlsx as Implementor;
use Ticaje\FileManager\Infrastructure\Driver\Iterator\SimpleIterator;
use Ticaje\FileManager\Infrastructure\Driver\Reader\File\Xlsx as FileAgent;

$fileName = '/path/to/file.xlsx'; // Too simple to explain
$implementor = new Implementor();
$fileManager = new FileAgent($implementor, true); // gonna say it has header
$fileManager->setSource($fileName);
$simpleIterator = new SimpleIterator($fileManager);

// Get first five rows
$firstFiveRows = $simpleIterator->getChunk(0, 5);
print_r($firstFiveRows); // printing content out

// Get rest of content
$content = $fileManager->getContent();
while ($content->valid()) {
    $item = $content->current();
    print_r($implementor->asArray($item)); // printing content out
    $content->next();
}

// Printing out header
$header = $fileManager->getHeader();
print_r($implementor->asArray($header));

让我解释我们系统的每个组件

实现者

这是包含当前XLSX文件实现的代理,只要它实现了Ticaje\FileManager\Infrastructure\Driver\Reader\Interfaces\Gateway\XlsxFileInterface,你可以添加自己的实现。

Ticaje\FileManager\Infrastructure\Driver\Reader\Interfaces\Gateway\XlsxFileInterface

它要求两个方法:fetchData和asArray,这两个方法是非常直观的。

文件代理

这是文件读取的高级解决方案,它是一个包装器,用于通过使用端口和适配器设计模式接受XLSX实现,因此它充当读取和提取的机器,使用内部通过引用提供的数据进行数据生成。

它接受负责读取文件的对象,可以是任何实现,无论文件是否包含标题。

简单迭代器

这是一个接受生成器(通过引用获取的内容)并对其进行自定义操作的类,在我们的例子中是提取文件的前五行,它不关心文件大小是330kb还是30Mb,它将通过引用获取内容,并按需动态访问它。

它接受文件内容作为Iterator,当然,以及提供使用自定义方法返回数据的实现者,例如提取单个单元格、一组行或文件的块。

这真的很简单,如果你尝试,你就会看到它如何快速获取所需的内容到浏览器/消费者。

鸣谢

许可

GNU通用公共许可证(GPLv3)。请参阅许可文件以获取更多信息。