Maison >développement back-end >tutoriel php >Solution au débordement de mémoire phpExcel lors de l'exportation de fichiers

Solution au débordement de mémoire phpExcel lors de l'exportation de fichiers

不言
不言original
2018-08-17 17:39:434709parcourir

Le contenu de cet article concerne la solution au débordement de mémoire phpExcel lors de l'exportation de fichiers. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Lors de l'utilisation de PHPExcel pour exporter des fichiers, des erreurs de dépassement de mémoire PHP sont souvent signalées car les fichiers sont trop volumineux. Afin de résoudre ce problème, vous pouvez utiliser les paramètres fournis par PHPExcel pour l'optimisation. . Le fichier Excel surdimensionné mentionné ici ne signifie pas nécessairement la taille du fichier, mais plus important encore, les données et le format stockés dans le fichier. S'il y a beaucoup de données et que le format est riche, cela épuisera facilement la mémoire de PHP.

L'information 2 souligne qu'une cellule dans Excel occupe environ 1 Ko de mémoire sans mise en cache activée, et qu'un tableau de 8 000 lignes et 31 colonnes (248 000 cellules) nécessite 242 Mo de mémoire. Si la mise en cache est activée, elle passera à 80 Mo et l'effet est toujours très évident.

Veuillez noter lors de son utilisation que les paramètres d'optimisation de la mémoire de PHPExcel ne sont pas dans l'objet PHPExcel et doivent être définis avant que PHPExcel ne soit instancié.

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '512MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings);

$oExcel = new PHPExcel();

Plusieurs paramètres de PHPExcel_Settings::setCacheStorageMethod()

Sérialiser les données de la cellule et les enregistrer en mémoire

PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;

Sérialiser la cellule Puis effectuer une compression Gzip, puis enregistrez-le en mémoire

PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;

Mise en cache dans un fichier disque temporaire, la vitesse peut être plus lente

PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;

Enregistrez-le dans php://temp

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

Enregistrer dans Memcache

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;  
$cacheSettings = array( 'memcacheServer'  => 'localhost',  
    'memcachePort'    => 11211,  
    'cacheTime'       => 600  
);  
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

Autres moyens de réduire l'utilisation de la mémoire

Si vous n'avez pas besoin de lire le format de cellule Excel, vous pouvez le configurer pour lire uniquement les données.

$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx”);

S'il y a plusieurs feuilles dans Excel, mais que nous n'avons besoin d'en lire que quelques-unes, afin de réduire la consommation de mémoire, nous pouvons également le configurer.

$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setLoadSheetsOnly( array("Worksheet1", "Worksheet2") );
$objPHPExcel = $objReader->load("test.xlsx”);

Si vous n'avez besoin de lire qu'une certaine zone de la feuille, vous pouvez également définir un filtre.

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(&#39;Excel2007&#39;);
$objReader->setReadFilter( new MyReadFilter() );
$objPHPExcel = $objReader->load("test.xlsx”);

Au final, j'ai utilisé la méthode suivante

// 如果是因为特殊字符引起的,可以在load方法之前加上setReadDataOnly(意思是忽略任何格式的信息)方法,就可以避免 
$objReader->setReadDataOnly(true);//只需要添加这个方法
$objPHPExcel = $objReader->load($uploadFilePath);

Recommandations associées :

Solution à l'erreur de dépassement de mémoire lorsque phpExcel exporte de grandes quantités de data

Problèmes liés à la sauvegarde et au téléchargement des fichiers Excel exportés par phpexcel

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn