Heim > Backend-Entwicklung > PHP-Tutorial > Lösung für den PHPExcel-Speicherüberlauf beim Exportieren von Dateien

Lösung für den PHPExcel-Speicherüberlauf beim Exportieren von Dateien

不言
Freigeben: 2023-04-03 19:50:01
Original
4712 Leute haben es durchsucht

Der Inhalt dieses Artikels befasst sich mit der Lösung des PHPExcel-Speicherüberlaufs beim Exportieren von Dateien. Ich hoffe, dass er für Freunde hilfreich ist.

Bei der Verwendung von PHPExcel zum Exportieren von Dateien werden häufig PHP-Speicherüberlauffehler gemeldet, da die Dateien zu groß sind. Um dieses Problem zu lösen, können Sie die von PHPExcel bereitgestellten Parameter zur Optimierung verwenden . Die hier erwähnte übergroße Excel-Datei bedeutet nicht unbedingt die Dateigröße, sondern, was noch wichtiger ist, die in der Datei gespeicherten Daten und das Format. Wenn viele Daten vorhanden sind und das Format umfangreich ist, wird der Speicher von PHP leicht erschöpft.

Information 2 weist darauf hin, dass eine Zelle in Excel ohne aktiviertes Caching etwa 1 KB Speicher belegt und eine Tabelle mit 8.000 Zeilen und 31 Spalten (248.000 Zellen) 242 MB Speicher benötigt. Wenn Caching aktiviert ist, sinkt die Größe auf 80 MB, und der Effekt ist immer noch sehr deutlich.

Bitte beachten Sie bei der Verwendung, dass die Speicheroptimierungsparameter von PHPExcel nicht im PHPExcel-Objekt enthalten sind und vor der Instanziierung von PHPExcel festgelegt werden müssen.

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

$oExcel = new PHPExcel();
Nach dem Login kopieren

Mehrere Parameter von PHPExcel_Settings::setCacheStorageMethod()

Serialisieren Sie die Zellendaten und speichern Sie sie im Speicher

PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;
Nach dem Login kopieren

Serialisieren Sie die Zellen vor der Ausführung von Gzip. Komprimiert und dann im Speicher gespeichert

PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
Nach dem Login kopieren

Cache in temporärer Festplattendatei, kann langsamer sein

PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
Nach dem Login kopieren

Speichern in php://temp

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
Nach dem Login kopieren

Speichern in

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

Andere Möglichkeiten zur Reduzierung Speichernutzung im Memcache

Wenn Sie das Excel-Zellenformat nicht lesen müssen, können Sie es so einstellen, dass nur Daten gelesen werden.

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

Wenn es in Excel mehrere Tabellenblätter gibt, wir aber nur einige davon lesen müssen, können wir dies auch festlegen, um den Speicherverbrauch zu reduzieren.

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

Wenn Sie nur einen bestimmten Bereich im Blatt lesen müssen, können Sie auch einen Filter setzen.

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”);
Nach dem Login kopieren

Am Ende habe ich die folgende Methode verwendet

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

Verwandte Empfehlungen:

Lösung für den Speicherüberlauffehler, wenn phpExcel große Datenmengen exportiert

Probleme beim Speichern und Herunterladen von Excel-Dateien, die von PHPExcel exportiert wurden

Das obige ist der detaillierte Inhalt vonLösung für den PHPExcel-Speicherüberlauf beim Exportieren von Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage