【问题标题】:How to decompress tar.gz file with low memory usage [php 7]?如何解压低内存使用的 tar.gz 文件 [php 7]?
【发布时间】:2020-11-27 01:53:15
【问题描述】:

我有一个 4 GB 的 tar.gz 文件,我想解压缩成一个 tar 文件。我一直在用

$p = new PharData('/path/to/file/name');
$p->decompress();

尝试这样做。但是我收到错误“PHP 致命错误:允许的内存大小为 8589934592 字节已用尽(尝试分配 36864 字节)”

我尝试过的事情:

(1) ini_set('memory_limit', '-1'); 结果:通用“已杀死”错误消息

(2) ini_set('memory_limit', '6000M'); 结果:“PHP 致命错误:允许的内存大小为 8589934592 字节已用尽(尝试分配 36864 字节)”错误消息

我还对 php.ini 文件进行了相同的更改。如何将 tar.gz 文件解压成 tar 文件?

【问题讨论】:

  • 之后你想对未压缩的文件做什么?该问题的答案将大大缩小您问题的可能答案范围。
  • 我建议使用shell_exec() 并执行tar cli,而不是通过PHP。
  • @Sammitch 之后我想提取 tar 文件并解析它包含的 csv
  • 如果您的 tar.gz 为 4GB,则您的 CSV 必须是巨大的。接下来,在实际使用该数据时处理内存不足错误。如果您不需要一遍又一遍地执行此操作,只需直接在 shell 中解压缩即可,而不是一开始就涉及 PHP。

标签: php


【解决方案1】:

显然,phar:// 流包装器将允许您直接从 gzip 压缩的 TAR 中读取 CSV 文件内容。

$fh = fopen('phar://example.tar.gz/target_file.csv', 'r');

while( $row = fgetcsv($fh) ) {
    // code!
}

这应该利用 PHP 的流优势,以便在给定时间从文件中读取不需要超过几千字节的实际驻留在内存中。

也就是说,如果您开始只是在该循环中将行附加到数组中,您将遇到同样的内存问题。对行做一些事情,然后丢弃它。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多