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');
}
Si cache_to_phpTemp ne fonctionne pas, ce qui de la mise en cache d'autres stratégies avez-vous utilisées? cache_to_sqlite ou cache_to_sqlite3 sont très efficace en terme de mémoire
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