【问题标题】:Memory size exhausted (File smaller than my MEMORY_LIMIT)内存大小耗尽(文件小于我的 MEMORY_LIMIT)
【发布时间】:2016-10-27 07:00:03
【问题描述】:

我遇到了一个烦人的问题,这就是这个主题的标题。我正在尝试读取 MP4 格式文件(即 69,5 MB。总共 72 899 060 字节),但一直收到此错误。在阅读此文件之前,我使用函数memory_get_usage() 请求内存的当前使用情况。提到总规模为 128 MB(这是我在 PHP.ini 中的 memory_limit)中仅使用了 3 MB。

这是我当前收到的确切错误消息:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72900608 bytes)

用于“读取”此文件的函数是file_get_contents(),它只是检索给定路径/文件的内容。

代码示例/“功能”:

echo memory_get_usage() . "<br/>";
$tmpItem = 'mypath/tofile/myfile.mp4';

echo file_get_contents($tmpItem);
echo memory_get_usage() . "<br/>";

我不明白我们是如何从使用 3 MB 增加到最终需要 198 MB 的。有什么想法吗?

  • 附加:我还尝试过 fopen()、fread()、fclose 和 readfile()。遗憾的是,所有这些都具有上述相同的效果。

【问题讨论】:

  • 您正在尝试使用 : file_get_contents 回显文件,很明显这会导致内存大小耗尽。因为这不是您播放视频文件的方式
  • 我不想播放视频文件。我正在尝试获取它的内容。
  • 不管怎样,你不应该回显它,把它写到一个文件中。
  • @ArshSingh 我希望该文件最终将其内容压缩到一个 zip 文件中。所以这就是我试图获取文件内容的原因。
  • @ArshSingh 首先将其分配给一个变量,然后回显该变量,其值将产生相同的结果。刚刚测试过了。

标签: php file memory file-get-contents readfile


【解决方案1】:

通过file_get_contents($tmpItem);,您获得的内存比mypath/tofile/myfile.mp4 分配的同等大小的内存要多(如何在不将文件加载到内存的情况下“获取文件内容”?!),这足以解释内存的上升。

【讨论】:

    【解决方案2】:

    PHP 将分配比实际使用更多的内存。在尝试分配更多时,它失败了。尝试memory_get_usage(true); 以查看分配的(保留)内存,而不是实际使用的内存。

    如果你想处理文件的内容,你需要更多的内存,比如几 GB。

    如果你只是想压缩视频,你可以通过系统调用来做到这一点而不使用任何内存(假设安装了 GNU Linux + zip):

    <?php
    exec('zip -v', $output, $zipFound);
    
    if ($zipFound > 0) {
        throw new \Exception('Error accessing `zip` from command line, is it installed?');
    }
    
    exec('zip -q ' . $outputZip . ' ' . $inputMp4, $output, $zipError);
    
    if ($zipError !== 0) {
        throw new \Exception('Error while compressing files: ' . $output);
    }
    

    【讨论】:

    • 感谢您的回复。在服务器调用中,是否有任何内置的“软件”可以将文件打包成 zips / tars?如果我使用 fread (包括块)检索我的内容并在每个块之后刷新我的输出缓冲区怎么样。这也可能吗?
    • @Testuser075 将文件打包成 zip 的软件?好吧,我在示例中向您展示了一个,不是吗?加载块也可以,但仍然没有必要。即使你使用 PHP 的 \ZipArchive 类,它也是你不需要的开销。
    • 您的方法需要大量 RAM。这就是为什么我很好奇我的是否应该工作。无法让它工作。
    • 当然需要一些内存来压缩文件...为什么你不让它工作?什么错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2014-04-30
    • 1970-01-01
    • 2014-09-12
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多