Pergunta

Eu estou usando uma função de descompactação simples (como visto abaixo) para os meus arquivos para que eu não tem que descompactar arquivos manualmente antes de serem processados ??posteriormente.

function uncompress($srcName, $dstName) {
    $string = implode("", gzfile($srcName));
    $fp = fopen($dstName, "w");
    fwrite($fp, $string, strlen($string));
    fclose($fp);
} 

O problema é que se o arquivo gzip é grande (por exemplo 50mb) a descompactação leva uma grande quantidade de memória RAM para processo.

A pergunta: Eu posso analisar um arquivo compactado em pedaços e ainda obter o resultado correto? Ou existe uma melhor outra maneira de lidar com a questão de extrair grandes arquivos gzip (mesmo que leva alguns segundos mais)?

Foi útil?

Solução

arquivo-gz () é um método de conveniência que as chamadas gzopen, gzread e gzclose.

Então, sim, você pode fazer manualmente o gzopen e gzread o arquivo em pedaços.

Isto irá descompactar o arquivo em blocos de 4 KB:

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

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

Outras dicas

tentar com

function uncompress($srcName, $dstName) {
    $fp = fopen($dstName, "w");
    fwrite($fp, implode("", gzfile($srcName)));
    fclose($fp);
}

$ parâmetro comprimento é opcional.

Se você estiver em um host Linux, tem as privilegies necessário para executar comandos, eo comando gzip está instalado, você poderia tentar chamá-lo com algo como shell_exec

Algo um pouco como isso, eu acho, faria:

shell_exec('gzip -d your_file.gz');

Desta forma, o arquivo não seria unzip pelo PHP.


Como nota:

  • Tome cuidado onde o comando é executado a partir de (uso ot um swith para dizer "descomprimir a que diretório")
  • Você pode querer dar uma olhada escapeshellarg também ;-)

Como maliayas mencionado, pode levar a uma erro. Eu experimentei uma queda inesperada fora do loop while, mas o arquivo GZ foi descomprimido com sucesso. Toda a aparência de código como este e funciona melhor para mim:

function gzDecompressFile($srcName, $dstName) { 
    $error = false; 

    if( $file = gzopen($srcName, 'rb') ) { // open gz file

        $out_file = fopen($dstName, 'wb'); // open destination file

        while (($string = gzread($file, 4096)) != '') { // read 4kb at a time   
            if( !fwrite($out_file, $string) ) { // check if writing was successful
                 $error = true;
            }   
        }

        // close files
        fclose($out_file);
        gzclose($file);     

    } else {
        $error = true;
    }

    if ($error)
        return false; 
    else
        return true; 
} 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top