Manejo de archivos grandes usando PHP sin agotamiento de la memoria
Leer y procesar archivos grandes en PHP puede ser un desafío debido a las limitaciones de memoria. La función file_get_contents() puede desencadenar un error de "Memoria agotada" cuando se trata de archivos grandes que consumen más memoria de la permitida.
Comprensión de la asignación de memoria
Al usar file_get_contents( ), el archivo completo se lee y se almacena como una cadena en la memoria. Para archivos grandes, esto puede exceder la memoria asignada y provocar el error.
Enfoque alternativo: lectura de archivos fragmentados
Para evitar este problema, considere usar métodos alternativos como como fopen() y fread() para leer el archivo en trozos. Esto le permite procesar secciones más pequeñas del archivo a la vez, administrando el uso de la memoria de manera efectiva. Aquí hay una función que implementa este enfoque:
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;
}
}
Ejemplo de uso
Para usar esta función, defina una devolución de llamada que maneje el fragmento y proporcione los parámetros necesarios:
$success = file_get_contents_chunked("my/large/file", 4096, function ($chunk, &$handle, $iteration) {
/* Do something with the chunk */
});
Consideraciones adicionales
Otra optimización es evitar el uso de expresiones regulares complejas, que pueden consumir una cantidad significativa de memoria cuando se aplican a entradas grandes. Considere usar funciones de cadena nativas como strpos, substr y explode en su lugar.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3