php file_get_contents():内容从 2147483648 字节截断为 2147483647 字节
php file_get_contents(): content truncated from 2147483648 to 2147483647 bytes
当我要创建 2GB 文件的 zip 文件时,如何找出问题。
错误
file_get_contents(): content truncated from 2147483648 to 2147483647
bytes
Fatal error: Out of memory (allocated 2151677952) (tried to allocate
18446744071562067968 bytes) in
我正在使用专用服务器并且已经设置 memory_limit,max_execution_time,max_upload_filesize,max_post_size
。但它不适用于 me.Please 检查我的代码并让我知道我做错了什么 -
创建新的 zip 对象
$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){
# download file
$download_file = file_get_contents($file_path.'/'.$file);
#add it to the zip
$zip->addFromString(basename($file_path.'/'.$file),$download_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);
尝试将这一行放在代码的开头:
ini_set("memory_limit", -1);
参考这个问题
Fatal error: Out of memory (allocated 1134559232) (tried to allocate 32768 bytes) in X:\wamp\www\xxx
您分配的内存永远无法超过 PHP_INT_MAX。因此,如果 PHP 的 linux x64 版本在内部不限于 signed int 32 位,但在 windows 或 32 位系统上,您可能会处理此问题没有流媒体就没有机会实现这一目标。
类似这样的方法可能有效:(尚未测试)
$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 没有为 zip 流提供模式“+w”...然后你最后的选择是,将整个文件写入临时文件(通过像流式传输一样在将其提供给外部程序(使用 system() 或 popen 调用...)或使用其他压缩格式(显然 php 支持 zlib ant bzip2 的写入流操作之前,我做到了,没有 file_get_contents) ) 或为 php 使用外部库。
我将 $zip->addFromString()
更改为 $zip->addFile()
因为你不需要读取内容文件来添加文件,我用 3 部电影测试你的代码但不起作用(我有同样的错误)但是当我使用 $zip->addFile()
时一切正常,我可以下载 3gb 的 zip 文件。
我需要使用set_time_limit(0);
如果要测试此代码,只需更改以下值:
$files //Array of files name
$file_path //Path where your files ($files) are placed
$last_seg //The name of your zip file
<?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);
?>
您可以在以下位置阅读更多信息:
当我要创建 2GB 文件的 zip 文件时,如何找出问题。
错误
file_get_contents(): content truncated from 2147483648 to 2147483647 bytes
Fatal error: Out of memory (allocated 2151677952) (tried to allocate 18446744071562067968 bytes) in
我正在使用专用服务器并且已经设置 memory_limit,max_execution_time,max_upload_filesize,max_post_size
。但它不适用于 me.Please 检查我的代码并让我知道我做错了什么 -
创建新的 zip 对象
$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){
# download file
$download_file = file_get_contents($file_path.'/'.$file);
#add it to the zip
$zip->addFromString(basename($file_path.'/'.$file),$download_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);
尝试将这一行放在代码的开头:
ini_set("memory_limit", -1);
参考这个问题 Fatal error: Out of memory (allocated 1134559232) (tried to allocate 32768 bytes) in X:\wamp\www\xxx
您分配的内存永远无法超过 PHP_INT_MAX。因此,如果 PHP 的 linux x64 版本在内部不限于 signed int 32 位,但在 windows 或 32 位系统上,您可能会处理此问题没有流媒体就没有机会实现这一目标。
类似这样的方法可能有效:(尚未测试)
$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 没有为 zip 流提供模式“+w”...然后你最后的选择是,将整个文件写入临时文件(通过像流式传输一样在将其提供给外部程序(使用 system() 或 popen 调用...)或使用其他压缩格式(显然 php 支持 zlib ant bzip2 的写入流操作之前,我做到了,没有 file_get_contents) ) 或为 php 使用外部库。
我将 $zip->addFromString()
更改为 $zip->addFile()
因为你不需要读取内容文件来添加文件,我用 3 部电影测试你的代码但不起作用(我有同样的错误)但是当我使用 $zip->addFile()
时一切正常,我可以下载 3gb 的 zip 文件。
我需要使用set_time_limit(0);
如果要测试此代码,只需更改以下值:
$files //Array of files name
$file_path //Path where your files ($files) are placed
$last_seg //The name of your zip file
<?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);
?>
您可以在以下位置阅读更多信息: