Heim >Backend-Entwicklung >PHP-Tutorial >PHPExcel exportiert große Datenmengen, löst Zeitüberschreitungen und Speicherfehler

PHPExcel exportiert große Datenmengen, löst Zeitüberschreitungen und Speicherfehler

巴扎黑
巴扎黑Original
2016-11-11 14:50:362160Durchsuche

PHP-Export in Excel ist etwas, auf das viele Kinder gestoßen sind. Es ist wirklich praktisch, die PHP-Klasse zu verwenden, aber beim Exportieren großer Datenmengen ist es oft mit einigen Zeitüberschreitungs- oder Speicherüberlaufproblemen verbunden Methoden anwenden, gemeinsam lernen und gemeinsam Fortschritte machen. . .

PHPExcel ist eine sehr leistungsstarke PHP-Open-Source-Klasse für die Verarbeitung von Excel. Ein großes Problem besteht jedoch darin, dass sie zu viel Speicher beansprucht. Ab 1.7.3 unterstützt sie das Festlegen der Zellen-Cache-Methode, wird jedoch empfohlen Um die aktuelle stabile Version 1.7.6 zu verwenden, da frühere Versionen in unterschiedlichem Maße Fehler aufweisen, ist das Folgende das offizielle Dokument:

Das offizielle Dokument von PHPExcel1.7.6 schreibt

PHPExcel verwendet durchschnittlich ca. 1 KB/Zelle in Ihren Arbeitsblättern, sodass große Arbeitsmappen schnell den verfügbaren Speicher verbrauchen können. Das Zell-Caching bietet einen Mechanismus, der es PHPExcel ermöglicht, die Zellobjekte in einer kleineren Speichergröße, auf der Festplatte oder im APC, Memcache oder Wincache zu verwalten als im PHP-Speicher. Dadurch können Sie den Speicherverbrauch für große Arbeitsmappen reduzieren, allerdings auf Kosten der Geschwindigkeit, die beim Zugriff auf Zelldaten sehr schnell verbraucht wird. Der Zell-Caching-Mechanismus ermöglicht es PHPExcel, kleine Zellobjekte im Speicher auf der Festplatte oder im APC, Memcache oder Wincache zwischenzuspeichern. Das Lesen der Daten dauert zwar einige Zeit, kann aber dabei helfen, den Speicherverbrauch zu reduzieren.

PHPExcel1.76.

Standardmäßig hält PHPExcel immer noch alle Zellobjekte im Speicher, aber Sie können Alternativen angeben, um das Zellcaching zu aktivieren: setCacheStorageMethod()-Methode, die die Caching-Methode übergibt, die Sie verwenden möchten

Standardmäßig speichert PHPExcel weiterhin Zellobjekte im Speicher, Sie können sie jedoch anpassen. Sie können die Methode PHPExcel_Settings::setCacheStorageMethod() verwenden und die Caching-Methode als Parameter an diese Methode übergeben, um die Caching-Methode festzulegen.

PHP-Code:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory;

PHPExcel_Settings::setCacheStorageMethod;

PHPExcel1.7 Dokumente, die

setCacheStorageMethod() geschrieben wurden, geben bei Erfolg einen booleschen Wert zurück, bei einem Fehler false (z. B. wenn versucht wird, in APC zwischenzuspeichern, wenn APC nicht aktiviert ist).

setCacheStorageMethod() gibt einen zurück Variablen vom Typ BOOL werden verwendet, um anzuzeigen, ob die Einstellung erfolgreich ist (wenn beispielsweise APC nicht verwendet werden kann und Sie die Verwendung des APC-Cache festlegen, wird false zurückgegeben).

Das offizielle PHPExcel1.7.6-Dokument schreibt

Für jedes einzelne Arbeitsblatt wird ein separater Cache verwaltet, der automatisch erstellt wird, wenn das Arbeitsblatt basierend auf der von Ihnen konfigurierten Caching-Methode und den Einstellungen instanziiert wird. Sie können die Konfigurationseinstellungen nicht mehr ändern, wenn Sie mit dem Lesen einer Arbeitsmappe begonnen haben oder haben Sie haben Ihr erstes Arbeitsblatt erstellt.

Jedes Arbeitsblatt verfügt über einen unabhängigen Cache. Wenn ein Arbeitsblatt instanziiert wird, wird es automatisch entsprechend der festgelegten oder konfigurierten Cache-Methode erstellt. Sobald Sie mit dem Lesen einer Datei beginnen oder Ihr erstes Arbeitsblatt erstellt haben, können Sie die Caching-Methode nicht mehr ändern.

Die offizielle Dokumentation von PHPExcel1.7.6 schreibt

Derzeit sind die folgenden Caching-Methoden verfügbar

Derzeit sind die folgenden Caching-Methoden verfügbar:

Php-Code :

PHPExcel_CachedObjectStorageFactory::cache_in_memory;

Die offizielle Dokumentation von PHPExcel1.7.6 schreibt

Die Standardeinstellung. Wenn Sie keine Caching-Methode initialisieren, ist dies die Methode, die PHPExcel verwendet wird verwendet. Zellenobjekte werden wie bisher im PHP-Speicher verwaltet. Wenn Sie keine Cache-Methode initialisieren, verwendet PHPExcel standardmäßig die Speicher-Cache-Methode.

========================================== == ===

PHP-Code:

PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;

Die offizielle Dokumentation von PHPExcle1.7.6 schreibt

Mit dieser Caching-Methode werden Zellen verwendet Wird im PHP-Speicher als Array serialisierter Objekte gespeichert, was den Speicherbedarf bei minimalem Leistungsaufwand reduziert. Eine Lösung mit relativ hoher Effizienz und Leistung.

========================================== == ===

PHP-Code:

PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;

Das offizielle Dokument von PHPExcel1.7.6 schreibt

Wie Cache_in_memory_serialized speichert diese Methode Zellen im PHP-Speicher als Array serialisierter Objekte, jedoch gkomprimiert, um die Speichernutzung noch weiter zu reduzieren, obwohl der Zugriff zum Lesen oder Schreiben einer Zelle etwas langsamer ist

Ähnlich wie bei der Serialisierungsmethode führt diese Methode nach der Serialisierung eine GZIP-Komprimierung durch und legt sie dann im Speicher ab. Diesmal wird die Speichernutzung weiter reduziert, das Lesen und Schreiben ist jedoch etwas langsamer.

========================================== == ==============

PHP-Code:

PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;

PHPExcel1.7.6 offizielles Dokument schreibt

Bei Verwendung von „cache_to_discISAM“ werden alle Zellen in einer temporären Festplattendatei gespeichert, wobei nur ein Index zu ihrem Speicherort in dieser Datei im PHP-Speicher verwaltet wird. Dies ist langsamer als jede der „cache_in_memory“-Methoden, reduziert jedoch den Speicherbedarf erheblich. Die temporäre Festplattendatei wird automatisch gelöscht, wenn Ihr Skript beendet wird.

Bei Verwendung von „cache_to_discISAM“ werden alle Zellen in einer temporären Festplattendatei gespeichert, und nur ihr Speicherort in der Datei wird gespeichert langsamer sein als jeder In-Memory-Cache, kann aber die Speichernutzung erheblich reduzieren. Die temporäre Festplattendatei wird automatisch gelöscht, wenn das Skript endet.

========================================== == =============

PHP-Code:

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

PHPExcel1.7.6 offizielles Dokument schreibt

Wie bei „cache_to_discISAM“ werden bei Verwendung von „cache_to_phpTemp“ alle Zellen im php://temp-E/A-Stream gehalten, wobei nur ein Index zu ihrem Speicherort im PHP-Speicher verwaltet wird. In PHP speichert der php://memory-Wrapper Daten im Speicher: php://temp verhält sich ähnlich, verwendet jedoch eine temporäre Datei zum Speichern der Daten, wenn ein bestimmtes Speicherlimit erreicht ist. Sie können dies jedoch ändern, wenn Sie „cache_to_phpTemp“ initialisieren > Ähnlich wie bei „cache_to_discISAM“ sind bei Verwendung von „cache_to_phpTemp“ alle Zellen weiterhin im E/A-Stream „php://temp“ vorhanden und nur ihre Positionen werden im Speicher von PHP gespeichert. Der php://memory-Wrapper von PHP verhält sich ähnlich, aber wenn die Größe der gespeicherten Daten das Speicherlimit überschreitet, werden die Daten in einer temporären Datei gespeichert. aber Sie können es während der Initialisierung ändern:

PHP-Code:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

$cacheSettings = array( ' memoryCacheSize ' => ' 8MB' );

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

Das offizielle Dokument von PHPExcel1.7.6 schreibt

Die php://temp-Datei wird automatisch gelöscht, wenn Sie Skript wird beendet.

php://temp-Datei wird automatisch gelöscht, wenn das Skript endet.

========================================== == =============

PHP-Code:

PHPExcel_CachedObjectStorageFactory::cache_to_apc;

PHPExcle1.7.6 offizielles Dokument schreibt

Bei Verwendung von „cache_to_apc“ werden Zellobjekte in APC verwaltet, wobei nur ein Index im PHP-Speicher verwaltet wird, um zu identifizieren, dass die Zelle vorhanden ist. Standardmäßig wird ein APC-Cache-Timeout von 600 Sekunden verwendet, was für die meisten Anwendungen ausreichen sollte : Dies kann jedoch bei der Initialisierung von „cache_to_APC“ geändert werden.

Bei Verwendung von „cache_to_apc“ werden die Zellen in APC gespeichert und nur der Index wird im Speicher gespeichert. Das Standard-APC-Cache-Timeout beträgt 600 Sekunden, was für die meisten Anwendungen ausreicht. Natürlich können Sie es auch während der Initialisierung ändern:

PHP-Code:



$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_APC;

$cacheSettings = array( 'cacheTime' => 600 );

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); PHPExcel1 In der offiziellen Dokumentation zu .7.6 heißt es:

Wenn Ihr Skript beendet wird, werden alle Einträge aus APC gelöscht, unabhängig vom CacheTime-Wert, sodass es nicht für die dauerhafte Speicherung mit diesem Mechanismus verwendet werden kann

Wenn At Am Ende der Skriptausführung werden alle Daten aus dem APC gelöscht (Cache-Zeit ignoriert) und dieser Mechanismus kann nicht als persistenter Cache verwendet werden.

========================================== == ===============

PHP-Code:



PHPExcel_CachedObjectStorageFactory::cache_to_memcache

PHPExcel1. 7.6 offiziell In der Dokumentation heißt es:

Bei Verwendung von „cache_to_memcache“ werden Zellobjekte im Memcache verwaltet, wobei nur ein Index im PHP-Speicher verwaltet wird, um zu identifizieren, dass die Zelle vorhanden ist.

Standardmäßig sucht PHPExcel nach einem Memcache-Server auf localhost an Port 11211. Außerdem wird ein Memcache-Timeout-Limit von 600 Sekunden festgelegt. Wenn Sie Memcache auf einem anderen Server oder Port ausführen, können Sie diese Standardeinstellungen ändern, wenn Sie „cache_to_memcache“ initialisieren:

Bei Verwendung von „cache_to_memory“ wird das Zellobjekt im Memcache gespeichert und nur der Index im Speicher. Standardmäßig sucht PHPExcel nach dem Memcache-Dienst auf localhost und Port 11211, mit einer Zeitüberschreitung von 600 Sekunden. Wenn Sie den Memcache-Dienst auf anderen Servern oder anderen Ports ausführen, können Sie ihn während der Initialisierung ändern:

Php Code:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;

$cacheSettings = array( 'memcacheServer' => 'localhost',

'memcachePort' => 11211,

'cacheTime' => 600

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); MS hat es noch nicht getan. Schade, dass es die Abfrage mehrerer Memcache-Server unterstützt.

Das offizielle PHPExcel1.7.6-Dokument schreibt:

Wenn Ihr Skript beendet wird, werden alle Einträge aus dem Memcache gelöscht, unabhängig vom CacheTime-Wert, sodass es nicht für die dauerhafte Speicherung mit diesem Mechanismus verwendet werden kann

Wenn das Skript endet, werden alle Daten aus dem Memcache gelöscht (Cache-Zeit wird ignoriert) und dieser Mechanismus kann nicht für die dauerhafte Speicherung verwendet werden.

========================================== == =============

PHP-Code:

PHPExcel_CachedObjectStorageFactory::cache_to_wincache;

PHPExcel1.7.6 offizielles Dokument schreibt

Bei Verwendung von „cache_to_wincache“ werden Zellobjekte in Wincache verwaltet, wobei nur ein Index im PHP-Speicher verwaltet wird, um zu identifizieren, dass die Zelle vorhanden ist. Standardmäßig wird ein Wincache-Cache-Timeout von 600 Sekunden verwendet, was für die meisten Anwendungen ausreichen sollte : Obwohl es möglich ist, dies bei der Initialisierung von „cache_to_wincache“ zu ändern, wird das Zellenobjekt in Wincache gespeichert und nur der Index wird im Speicher gespeichert. Standardmäßig beträgt die Ablaufzeit von „cache_towincache“. 600 Sekunden, was für die meisten Benutzer sehr wichtig ist. Es reicht für die meisten Anwendungen aus und kann natürlich während der Initialisierung geändert werden:

PHP-Code:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_wincache ;

$cacheSettings = array( 'cacheTime ' => 600 );

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

PHPExcel offizielles Dokument 1.7.6 schrieb

Wenn Ihr Skript beendet wird, werden alle Einträge aus dem Wincache gelöscht, unabhängig vom CacheTime-Wert, sodass es mit diesem Mechanismus nicht für die dauerhafte Speicherung verwendet werden kann.

PHPExcel ist immer noch relativ leistungsfähig Das größte Problem ist die Speichernutzung. Wann wird PHPExcel veröffentlicht, das nicht so viele ausgefallene Funktionen erfordert und nur die häufigsten Daten exportieren muss?

Der obige Inhalt ist ein relativ guter Artikel, den LZ im Internet gefunden hat. Obwohl er mein Problem nicht vollständig gelöst hat, möchte ich das als Hinweis auffassen Es kann hilfreich sein, die Kinderschuhe zu sehen, die ich gesehen habe.

Stellungnahme:
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