php文件_get_contents():内容从2147483648字节截断为2147483647字节

php文件_get_contents():内容从2147483648字节截断为2147483647字节,php,file,http-headers,zip,memory-limit,Php,File,Http Headers,Zip,Memory Limit,当我要创建2GB文件的zip文件时,如何找出问题所在 错误 file_get_contents():内容从2147483648截断为2147483647 字节 致命错误:内存不足(已分配2151677952)(试图分配 18446744071562067968字节) 我正在使用专用服务器,并且已经设置了内存限制、最大执行时间、最大上传文件大小、最大发布大小。但它不适合我。请检查我的代码,让我知道我做错了什么- 创建新的zip对象 尝试将这一行放在代码的开头: ini_set("memory_li

当我要创建2GB文件的zip文件时,如何找出问题所在

错误

file_get_contents():内容从2147483648截断为2147483647 字节

致命错误:内存不足(已分配2151677952)(试图分配 18446744071562067968字节)

我正在使用专用服务器,并且已经设置了
内存限制、最大执行时间、最大上传文件大小、最大发布大小
。但它不适合我。请检查我的代码,让我知道我做错了什么-

创建新的zip对象
尝试将这一行放在代码的开头:

ini_set("memory_limit", -1);
参考这个问题

您永远无法分配比PHP_INT_MAX更多的内存。因此,如果文件内容在内部不限于32位签名的INT,那么linux x64版本的PHP可能可以处理这一问题,但在windows或32位系统上,如果没有流式处理,您就没有机会实现这一点

类似的东西可能会起作用:(尚未测试)


好的,我的坏消息是PHP没有为zip流提供“+w”模式。。。最后一个选项是,在将整个文件发送给外部程序(使用system()或popen调用…)之前,将其写入临时文件(通过像我一样流式传输,没有文件内容),或者使用另一种压缩格式(显然php支持zlib ant bzip2的写流操作),或者使用php的外部库

我将
$zip->addFromString()
更改为
$zip->addFile()
,因为您不需要阅读内容文件来添加文件,我用3部电影测试了您的代码,但不起作用(我有相同的错误),但当我使用
$zip->addFile()
时,一切正常,我可以下载3gb的zip文件

我需要使用
设置时间限制(0)

如果要测试此代码,请仅更改以下值:

$files//文件名数组
$file\u path//放置文件($files)的路径
$last_seg//zip文件的名称

<?php

    set_time_limit(0);

    $files = array('Exodus.mp4', 'the-expert.webm', 'what-virgin-means.webm');
    $file_path = 'zip';
    $last_seg = 'test';

    $zip = new ZipArchive();

    # create a temp file & open it
    $tmp_file = tempnam('.','');
    $zip->open($tmp_file, ZipArchive::CREATE);

    # loop through each file
    foreach($files as $file){
        $zip->addFile($file_path.'/'.$file, $file);
    }

    # close zip
    $zip->close();
    $zip_name = $last_seg.'.zip';
    # send the file to the browser as a download
    header("Content-disposition: attachment; filename=$zip_name");
    header('Content-type: application/zip');
    readfile($tmp_file);

?>

您可以在以下网址阅读更多内容:


尝试此处提供的此解决方案这是一个内存限制问题,如果您的文件太大。同时检查此问题/答案可能重复非常感谢,它可能是重复的问题,但在尝试了此处提供的所有解决方案后,我又问了一遍。我已尝试从WHM增加内存限制,但不起作用:(消息上说您正在尝试分配18446744 TB。我认为您不仅应该调整内存限制,还应该购买更多的RAM…好的,非常感谢您给了您宝贵的时间,我会试试这个。我已经在WHM上尝试了memory_limit=-1,但它不起作用。-1 18446744071562067968的大小将超出系统内存。添加增加内存以将文件读入内存总是一个坏主意。谢谢你,mathieu,所以我需要更改代码?你知道我应该在这里做什么更改吗?或者我可以找到引用的任何链接?基本上,你需要打开一个zip流在其中写入,然后使用php可以处理的缓冲区重复读取输入文件…我不是如果没有外部库,当然可以。@jenifer不客气,别忘了检查是否已接受;-)如果你不知道如何阅读此@jenifer记住接受答案,记住你说它工作得很好;-)@jenifer如果你不知道如何检查已接受的答案,请阅读此文
$fr = fopen("http://...", "r");
$fw = fopen("zip://c:\\test.zip#test", "w");

while(false !== ($buffer = fread($fr, 8192)))
{
  fwrite($fw, $buffer, strlen($buffer));
}

fclose($fr);
fclose($fw);
<?php

    set_time_limit(0);

    $files = array('Exodus.mp4', 'the-expert.webm', 'what-virgin-means.webm');
    $file_path = 'zip';
    $last_seg = 'test';

    $zip = new ZipArchive();

    # create a temp file & open it
    $tmp_file = tempnam('.','');
    $zip->open($tmp_file, ZipArchive::CREATE);

    # loop through each file
    foreach($files as $file){
        $zip->addFile($file_path.'/'.$file, $file);
    }

    # close zip
    $zip->close();
    $zip_name = $last_seg.'.zip';
    # send the file to the browser as a download
    header("Content-disposition: attachment; filename=$zip_name");
    header('Content-type: application/zip');
    readfile($tmp_file);

?>