library - phpspreadsheet''s
¿Cómo arreglar memoria agotada con PHPExcel? (8)
El hecho de que el archivo de datos solo tenga X bytes, no significa que use X bytes de RAM. Por ejemplo, solo 4K de datos en una matriz $ _SESSION usa 64K de RAM cuando se cargan. Solo depende de lo que el código está haciendo con esos datos. La respuesta correcta es aumentar la cantidad de ram.
Además, si se trata de un archivo XLSX, son documentos XML comprimidos. Los archivos de texto se cierran mucho más que la mitad, por lo que su archivo 350K XLSX es fácilmente un archivo Excel de 1MB.
Error grave: el tamaño de memoria permitido de 134217728 bytes se agotó (se intentó asignar 1078799 bytes) en D: / xampplite / htdocs / Scraper / PHPExcel / Reader / Excel2007.php en la línea 269
Mi límite de memoria de 128M PHP se agota rápidamente incluso cuando solo intento abrir un pequeño archivo de Excel de ~ 350 KB con PHPExcel.
Aunque, puedo aumentar el límite de memoria en la configuración, pero será genial ver si hay alternativas para solucionar este problema.
El tamaño del archivo no es una buena medida para los archivos de libro de trabajo cuando se trabaja con PHPExcel. El número de filas y columnas (es decir, celdas) es más importante.
El código PHPExcel en sí tiene una huella de entre 10 y 25 MB, según los componentes a los que se accede.
En la actualidad, cada celda en un libro de trabajo toma en promedio 1k de memoria (sin ningún almacenamiento en caché) o 1.6k en PHP de 64 bits. Supondré PHP de 32 bits por el momento, así que (por ejemplo) una hoja de trabajo de 8000 líneas con 31 columnas (248,000 celdas) será de unos 242MB. Con el almacenamiento en caché de células (como php: // temp o DiskISAM), se puede reducir a aproximadamente un tercio, por lo que las 8000 líneas por 31 columnas requerirán aproximadamente 80 MB.
Hay una serie de opciones disponibles para ayudarlo a reducir el uso de la memoria:
¿Está utilizando el almacenamiento en caché de células con PHPExcel?
require_once ''./Classes/PHPExcel.php'';
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array( '' memoryCacheSize '' => ''8MB'');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$objReader = PHPExcel_IOFactory::createReader(''Excel2007'');
$objPHPExcel = $objReader->load("test.xlsx");
Si solo necesita acceder a los datos en sus hojas de trabajo, y no necesita acceder al formato de celda, puede deshabilitar la lectura de la información de formato del libro:
$objReader = PHPExcel_IOFactory::createReader(''Excel2007'');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx");
Si solo necesita acceder a algunas, pero no a todas las hojas de trabajo del libro de trabajo, puede cargar solo esas hojas de trabajo:
$objReader = PHPExcel_IOFactory::createReader(''Excel2007'');
$objReader->setLoadSheetsOnly( array("Worksheet1", "Worksheet2") );
$objPHPExcel = $objReader->load("test.xlsx");
Si solo desea leer ciertas celdas dentro de las hojas de trabajo, puede agregar un filtro:
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
public function readCell($column, $row, $worksheetName = '''') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader(''Excel2007'');
$objReader->setReadFilter( new MyReadFilter() );
$objPHPExcel = $objReader->load("test.xlsx");
Todas estas técnicas pueden reducir significativamente los requisitos de memoria.
Esta publicación habla sobre cómo cerrar un lector PHPExcel: cómo cerrar un archivo de Excel en php-excel-reader Si está abriendo varios archivos de Excel simultáneamente, pero en realidad no los necesita todos al mismo tiempo, podría intentar abrir y cerrar (es decir, desarmar) los lectores de cada archivo uno por uno. Por cierto, usar el mismo nombre de variable para los lectores sería suficiente para la operación de "desarmado".
PHPExcel es conocido por las fugas de memoria. Le aconsejo que use lo siguiente que necesita una FRACCIÓN de la memoria que utiliza PHPExcel .:
1) Para la lectura: PHP-Excel-Reader
2) Para escribir: Pear Spreadsheet Excel Writer
Si quieres averiguarlo, puedes usar xhprof . De acuerdo con este enlace, puede rastrear el uso de memoria con él ...
Una cosa que debe tener en cuenta también es celdas vacías.
Tuve el mismo problema, solo 800 filas de datos y la secuencia de comandos ni siquiera podía leer. Tanto los tiempos de espera como los errores de falta de memoria cuando se solucionaron.
Algo que dijo Mark Baker sobre las células me hizo pensar. Noté que tenía un montón de celdas vacías y copiar solo las celdas con datos a un nuevo libro de trabajo lo ejecutó en un segundo.
Espero que esto ayude a alguien.
Xdebug es un generador de perfiles / depurador para php y puede ayudarte a rastrear a través del uso de la memoria y las llamadas funcionales para descubrir dónde está el problema. Y es fácil de instalar, la mayoría de las distribuciones de Linux lo tienen en el repositorio, "yum install xdebug", "apt-get install xdebug".
$objReader = PHPExcel_IOFactory::createReader(''Excel2007'');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx");
Este código es suficiente