"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como lidar com arquivos grandes em PHP de maneira eficiente, sem causar esgotamento de memória?

Como lidar com arquivos grandes em PHP de maneira eficiente, sem causar esgotamento de memória?

Publicado em 31/10/2024
Navegar:832

How to Handle Large Files in PHP Efficiently without Causing Memory Exhaustion?

Tratamento de arquivos grandes usando PHP sem esgotamento de memória

Ler e processar arquivos grandes em PHP pode ser desafiador devido às limitações de memória. A função file_get_contents() pode acionar um erro "Memória esgotada" ao lidar com arquivos grandes que consomem mais memória do que o permitido.

Compreendendo a alocação de memória

Ao usar file_get_contents( ), todo o arquivo é lido e armazenado como uma string na memória. Para arquivos grandes, isso pode exceder a memória alocada e levar ao erro.

Abordagem alternativa: leitura de arquivos em pedaços

Para evitar esse problema, considere usar métodos alternativos, como como fopen() e fread() para ler o arquivo em pedaços. Isso permite processar seções menores do arquivo por vez, gerenciando o uso de memória de maneira eficaz. Aqui está uma função que implementa esta abordagem:

function file_get_contents_chunked($file, $chunk_size, $callback)
{
    try {
        $handle = fopen($file, "r");
        $i = 0;
        while (!feof($handle)) {
            call_user_func_array($callback, [fread($handle, $chunk_size), &$handle, $i]);
            $i  ;
        }
        fclose($handle);
        return true;
    } catch (Exception $e) {
        trigger_error("file_get_contents_chunked::" . $e->getMessage(), E_USER_NOTICE);
        return false;
    }
}

Exemplo de uso

Para usar esta função, defina um retorno de chamada que lide com o pedaço e forneça os parâmetros necessários:

$success = file_get_contents_chunked("my/large/file", 4096, function ($chunk, &$handle, $iteration) {
    /* Do something with the chunk */
});

Considerações adicionais

Outra otimização é evitar o uso de expressões regulares complexas, que podem consumir memória significativa quando aplicadas a entradas grandes. Considere usar funções de string nativas como strpos, substr e explode.

Declaração de lançamento Este artigo foi reimpresso em: 1729143617 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3