PHPExcel mémoire encore épuisé, même avec la cellule de mise en cache d'autres solutions
<b>Fatal error</b>: Allowed memory size of 134217728 bytes exhausted (tried to allocate 78 bytes) in <b>/var/www/leanne/api/classes/PHPExcel/CachedObjectStorage/PHPTemp.php</b> on line <b>66</b><br />
Salut,
J'ai demandé à cette question il y a quelques jours et a conseillé de changer mon code et d'utiliser la cellule de mise en cache. Alors que j'ai changé mon code et a tenté d'utiliser la cellule de mise en cache, j'ai toujours une erreur de mémoire. Je suis désespérée de trouver une solution à cette question.
Quelqu'un peut conseiller sur la méthode de mise en cache qui serait le mieux pour l'écriture des fichiers excel allant de 1 à 100 000 lignes de données? Si la cellule de mise en cache ne fonctionne pas, j'ai peut-être besoin d'utiliser une autre solution qui me permet d'ajouter à un fichier xls dans la même manière que je fais avec la version CSV.
Un exemple de mon code actuel est ci-dessous:
if ($count_prods > 0) {
$format = strtolower($export_data['output']);
$temp_file_location = '../temp/exports/products/';
$filename = 'data_' + $shop->ID . '_' . $export_id . '_test';
$separator = ',';
$endrow = "\n";
$fh = fopen($temp_file_location . $filename . '.csv', 'a');
/*$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array( ' memoryCacheSize ' => '8MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);*/
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_sqlite;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
$objPHPExcel = new PHPExcel();
$rowID = 2;
$counter = 1;
for ($i = 0; $i < $count_prods; $i += $batchlimit) {
$csv = '';
$limit = $batchlimit * $counter;
$start = $i + 1;
$productData = $productExport->getProductData($start, $limit);
if ($counter == 1) {
//get column names
if ($format == 'csv') {
$column_titles = implode(',', $productExport->product_fields);
$column_no = count($column_titles);
$csv = $column_titles . $endrow;
} else {
$objPHPExcel->getActiveSheet()->fromArray($productExport->product_fields, NULL, 'A1');
}
}
//loop through data export array
foreach ($productData as $product_id => $product_details) {
$columnID = 'A';
foreach ($product_details as $key => $value) {
if ($format == 'csv') {
$csv .= '"' . str_replace('"', '\'', $product_details[$key]) . '"' . $separator;
} else {
$objPHPExcel->getActiveSheet()->setCellValue($columnID . $rowID, $product_details[$key]);
}
$columnID++;
}
if ($format == 'csv') {
$csv = rtrim($csv, $separator);
$csv .= $endrow;
}
$rowID++;
}
if ($format == 'csv') {
fwrite($fh, $csv);
$csv = '';
}
$counter++;
}
if ($format == 'csv') {
fclose($fh);
}
//if XLS file
if ($format == 'xls') {
//$objPHPExcel = $objReader->load($temp_file_location . $filename . '.csv');
//$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
//$objWriter->save($temp_file_location . $filename . '.xls');
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save($temp_file_location . $filename . '.xlsx');
}
Mais si vous avez potentiellement 100 000 lignes, ne pas utiliser de Excel5 (à moins que vous fractionner dans deux feuilles de calcul) car Excel5 BIFF (format) est limité à 65535 lignes par feuille de calcul)
XLS seulement permet un maximum de lignes 65 535. Êtes-vous certain que c'est le nombre de lignes dont vous avez besoin? Combien de feuilles de votre classeur Excel?
J'avais essayé un couple de d'autres méthodes, dont aucun n'a fonctionné. Je n'ai pas essayé cache_to_sqlite que je ne peux pas trouver des exemples sur la façon de le mettre en œuvre. Que dois-je utiliser à la place de Excel5?
La mise en cache de sqlite est le développeur d'docs, la section 4.2.1, également présent sur les PHPExcel wiki github.com/PHPOffice/PHPExcel/blob/develop/Documentation/...
OriginalL'auteur LeeTee | 2013-05-21
Vous devez vous connecter pour publier un commentaire.
vous pouvez augmenter la mémoire et du temps alloué à l'script à l'aide de:
ini_set('memory_limit', '2048M');
set_time_limit('1200');
Je ne crois pas qu'il existe un moyen de créer ou de mettre à jour un fichier Excel avec potentiellement 100 000 lignes de données et de les envoyer pour téléchargement à l'utilisateur. J'ai bricolé avec de gros fichiers Excel (de 1 500 000+ cellules avec beaucoup de formules) et dans mon expérience, vous ne pouvez pas obtenir le fichier Excel de la génération à la volée.
OriginalL'auteur MadDokMike
PHPExcel est un excelent bibliothèque, et je l'adore. Cependant, à l'appui de toutes ces fonctionnalités d'Excel, ça bouffe beaucoup de mémoire.
Que vous faites de la simple lecture et de l'écriture, sans aucune avancée d'Excel trucs.
Donner du Bec de l'essayer. https://github.com/box/spout
De la principale description:
Bec est une bibliothèque PHP pour lire et écrire des fichiers de feuille de calcul (CSV, XLSX et ODS), rapidement et de manière évolutive. Contrairement à d'autres fichiers lecteurs ou écrivains, il est capable de traiter de très gros fichiers tout en gardant l'utilisation de la mémoire très faible (moins de 3 MO).
Pour l'exportation ou l'importation à partir d'excel, il est au moins 10x plus rapide et mange très peu de mémoire, comme c'est le flux de données vers et à partir du fichier
J'ai remplacé avec succès PHPExcel pour certains très gros fichiers Excel pour lequel je n'avais besoin que de l'exportation de données.
OriginalL'auteur Tiberiu-Ionuț Stan