代码之家  ›  专栏  ›  技术社区  ›  Amstutz

在ilias中使用flysystem追加到文件

  •  2
  • Amstutz  · 技术社区  · 6 年前

    我目前正在写一个记录器写入相当大的日志文件在伊利亚斯的一些插件。我正在使用整洁的新文件系统。由于新的日志消息需要附加到文件中,我不能简单地使用put或update,因为它们似乎总是截断日志文件。flysystem似乎不支持简单的append命令,因此我发现有一种工作方式是:

    $old_data = "";
    if ($DIC->filesystem()->storage()->has($this->path)) {
        $old_data = $DIC->filesystem()->storage()->read($this->path);
    }
    $DIC->filesystem()->storage()->put($this->path, $old_data.$string);
    

    但是,如果日志中附加了大量的数据,这对于io来说似乎非常昂贵。我想,这是最好用溪流。一、文件( https://github.com/ILIAS-eLearning/ILIAS/tree/release_5-3/src/Filesystem )我发现了以下情况:

    $webDataRoot = $DIC->filesystem()->web();
    $fileStream = $webDataRoot->readStream('relative/path/to/file');
    
    //seek at the end of the stream
    $fileStream->seek($fileStream->getSize() - 1);
    //append something
    $fileStream->write("something");
    

    但是,有了这个我得到了 无法写入不可写流 例外。看来,我需要像这样打开小溪:

    $resource = fopen('myPath', 'rw');
    

    然而,这在文档中是特别不鼓励的。使用ilias中的文件系统来解决这个问题的最佳方法是什么?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Nick    6 年前

    问题

    ilias的文件系统抽象利用flysystem来操作文件系统。不过,正如您已经指出的,flysystem不提供将数据附加到文件的简单方法。主要原因似乎是,由于底层技术(例如 S3 V3 storage adapter 重新上传整个文件。

    不幸的是,文档位于( https://github.com/ILIAS-eLearning/ILIAS/tree/release_5-3/src/Filesystem )是错误的,因为flysystem返回的流是只读的,因为某些文件系统适配器只“模拟”文件流的行为。流指向本地副本或内存流,而不是位于存储后端的“真实”文件,请参见 Flysystem AWS S3 Adapter 是的。

    结论

    总之,没有正确的方法将数据附加到现有的ILIAS文件系统实现的文件中,因为FielWew不提供这样的操作。 此外,即使Flyway会提供这种操作,一些存储后端仍然不支持这种操作。一个很好的例子是aws s3存储后端查看问题的答案 41783903 是的。

    用例的可能解决方法

    如果可以使用多个日志文件,请使用某种日志文件旋转来减少IO,这不是一个解决方案,但有助于将负载至少保持在一致的级别。例如,如果大小超过20MB,则写入新的日志文件,并保留最后20个日志文件。

    推荐文章