使用 php 在 gzopen 中解压缩大型 gzip 文件的合适缓冲区大小是多少


What is suitable buffer size for uncompressing large gzip files in gzopen using php?

function uncompress($srcName, $dstName) {
    $sfp = gzopen($srcName, "rb");
    $dstName = str_replace('.gz', '', $dstName);
    $fp = fopen($dstName, "w");
        fseek($FileOpen, -4, SEEK_END);
        $buf = fread($FileOpen, 4);
        $GZFileSize = end(unpack("V", $buf));
    while ($string = gzread($sfp, $GZFileSize)) {
        fwrite($fp, $string, strlen($string));
    }
    gzclose($sfp);
    fclose($fp);
}

我使用此代码进行解压缩,但它不起作用,并且出现以下错误:

内部服务器错误

服务器遇到内部错误或配置错误,并且 无法完成您的请求。

请联系服务器管理员,webmaster@example.com 和 告知他们错误发生的时间,以及您可能的任何内容 已经这样做了,这可能导致错误。

有关此错误的详细信息,请参阅服务器错误 .log。

此外,尝试使用错误文档处理请求时遇到 404 未找到错误。

这个函数看起来很粗略。您似乎正在用户空间中重新实现stream_copy_to_stream()。忘记缓冲区,只使用本机内容。

function uncompress($srcName, $dstName)
{
    $src = gzopen($srcName, 'rb');
    $dst = fopen($dstName, 'wb');
    stream_copy_to_stream($src, $dst);
    gzclose($src);
    fclose($dst);
}

想想看,您甚至可以使用copy()

function uncompress($srcName, $dstName)
{
    copy('compress.zlib://' . $srcName, $dstName);
}

我将函数更改为此,我的问题已解决:

function uncompress($srcName, $dstName) {
        $sfp = gzopen($srcName, "rb");
        $dstName = str_replace('.gz', '', $dstName);
        $fp = fopen($dstName, "w");

            $GZFileSize = filesize($srcName);

        while ($string = gzread($sfp, $GZFileSize)) {
            fwrite($fp, $string, strlen($string));
        }
        gzclose($sfp);
        fclose($fp);
    }

这应该可以帮助您查看错误消息。它要么显示在屏幕上,要么打印到 txt 文件中,尽管该目录必须可由 php 写入。

<?php //top of script
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', 'errors.txt');