php文件_get_contents():内容从2147483648字节截断为2147483647字节
当我要创建2GB文件的zip文件时,如何找出问题所在 错误 file_get_contents():内容从2147483648截断为2147483647 字节 致命错误:内存不足(已分配2151677952)(试图分配 18446744071562067968字节) 我正在使用专用服务器,并且已经设置了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
内存限制、最大执行时间、最大上传文件大小、最大发布大小
。但它不适合我。请检查我的代码,让我知道我做错了什么-
创建新的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);
?>