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

不言
Libérer: 2023-04-03 19:50:01
original
4663 Les gens l'ont consulté

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();
Copier après la connexion

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;
Copier après la connexion

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

PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
Copier après la connexion

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

PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
Copier après la connexion

Enregistrez-le dans php://temp

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
Copier après la connexion

Enregistrer dans Memcache

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;  
$cacheSettings = array( 'memcacheServer'  => 'localhost',  
    'memcachePort'    => 11211,  
    'cacheTime'       => 600  
);  
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
Copier après la connexion

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”);
Copier après la connexion

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”);
Copier après la connexion

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”);
Copier après la connexion

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

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

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal