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);

?>

您可以在以下位置阅读更多信息:

http://php.net/manual/en/ziparchive.addfile.php