我遇到了一个烦人的问题,这是本主题的标题。我试图读取MP4格式文件(69.5 MB(s)。总共72 899 060字节)但仍然收到此错误。在阅读此文件之前,我使用函数memory_get_usage()请求当前使用内存。提到只有3 MB使用的总规模为128 MB(这是我在PHP.ini中的memory_limit)。
这是我目前正在接收的确切错误消息:
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。有什么想法吗?
答案 0 :(得分:1)
通过file_get_contents($tmpItem);
,您可以获得超过mypath/tofile/myfile.mp4
等效大小的内存分配(如何“获取文件内容”而不将其加载到内存中?!),这足以说明正在进行的操作记忆。
答案 1 :(得分:0)
PHP将分配比实际使用的内存更多的内存。在尝试分配更多时,它失败了。尝试使用memory_get_usage(true);
查看已分配的(保留)内存,而不是实际使用的内存。
如果你想使用文件的内容,你需要更多的内存,比如几千兆字节。
如果您只是想压缩视频,可以通过系统调用来执行此操作,而无需使用任何内存(假设安装了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);
}