


PHP generiert und lädt Excel-Dateien mit extrem großen Datenmengen in Echtzeit herunter
Kürzlich erhielt ich eine Anfrage, die entsprechenden Benutzerzugriffsprotokolle für den ausgewählten Zeitraum zu exportieren. Aufgrund der großen Anzahl von Benutzern werden häufig mehr als 500.000 Daten exportiert.
Das häufig verwendete PHPexcel-Paket muss alle Daten abrufen, bevor es Excel generieren kann. Dies führt offensichtlich zu einem Speicherüberlauf, wenn eine Excel-Datei mit einer großen Datenmenge generiert wird. Erwägen Sie daher die Verwendung von PHP zum Schreiben Gleichzeitig ermöglicht der Ausgabestream dem Browser, die Anfrage in Form eines Downloads abzuschließen.
Wir schreiben den PHP-Ausgabestream wie folgt:
$fp = fopen('php://output', 'a'); fputs($fp, 'strings'); .... .... fclose($fp)
php://output ist ein beschreibbarer Ausgabestream, der es dem Programm ermöglicht, Ausgaben wie eine Datei in den Ausgabestream zu schreiben sendet den Inhalt im Ausgabestream an den Webserver und gibt ihn an den Browser zurück, der die Anfrage initiiert hat
Da die Excel-Daten außerdem nach und nach aus der Datenbank gelesen und dann in den Ausgabestream geschrieben werden, ist die Die Ausführung von PHP muss länger sein. Stellen Sie die Zeit länger ein (Standard 30 Sekunden). set_time_limit(0) begrenzt die PHP-Ausführungszeit nicht.
Hinweis:
Der folgende Code veranschaulicht nur die Ideen und Schritte zum Generieren von Excel mit großen Datenmengen. Nach dem Entfernen des Projektgeschäftscodes weist das Programm Syntaxfehler auf und nicht direkt ausgeführt werden kann, füllen Sie bitte den entsprechenden Geschäftscode entsprechend Ihren eigenen Bedürfnissen aus!
/** * 文章访问日志 * 下载的日志文件通常很大, 所以先设置csv相关的Header头, 然后打开 * PHP output流, 渐进式的往output流中写入数据, 写到一定量后将系统缓冲冲刷到响应中 * 避免缓冲溢出 */ public function articleAccessLog($timeStart, $timeEnd) { set_time_limit(0); $columns = [ '文章ID', '文章标题', ...... ]; $csvFileName = '用户日志' . $timeStart .'_'. $timeEnd . '.xlsx'; //设置好告诉浏览器要下载excel文件的headers header('Content-Description: File Transfer'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename="'. $fileName .'"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); $fp = fopen('php://output', 'a');//打开output流 mb_convert_variables('GBK', 'UTF-8', $columns); fputcsv($fp, $columns);//将数据格式化为CSV格式并写入到output流中 $accessNum = '1000000'//从数据库获取总量,假设是一百万 $perSize = 1000;//每次查询的条数 $pages = ceil($accessNum / $perSize); $lastId = 0; for($i = 1; $i <= $pages; $i++) { $accessLog = $logService->getArticleAccessLog($timeStart, $timeEnd, $lastId, $perSize); foreach($accessLog as $access) { $rowData = [ ......//每一行的数据 ]; mb_convert_variables('GBK', 'UTF-8', $rowData); fputcsv($fp, $rowData); $lastId = $access->id; } unset($accessLog);//释放变量的内存 //刷新输出缓冲到浏览器 ob_flush(); flush();//必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 } fclose($fp); exit(); }
Okay, es ist eigentlich ganz einfach, den Ausgabestream Schritt für Schritt zu schreiben und ihn an den Browser zu senden, damit der Browser die gesamte Datei Schritt für Schritt herunterlädt. Die Gesamtgröße der Datei kann nicht ermittelt werden, daher gibt es keine Die Methode besteht darin, dem Browser vor dem Herunterladen mitzuteilen, wie groß die Datei ist, indem header("Content-Length: $size"); festgelegt wird. Dies hat jedoch keinen Einfluss auf den Gesamteffekt. Das Kernproblem besteht darin, die Echtzeitgenerierung und den Download großer Dateien zu lösen.
Update: Lassen Sie mich hier über meine Idee der Datenbankabfrage sprechen, da die nach und nach in Excel geschriebenen Daten tatsächlich aus der Paging-Abfrage von MySQL stammen. Jeder weiß, dass die Syntax LIMIT ist Offset, Num, aber je größer der Offset, desto mehr Zeilen muss MySQL in jeder Paging-Abfrage überspringen, was die Effizienz von MySQL-Abfragen (einschließlich NoSQL wie MongoDB) erheblich beeinträchtigt. Es wird nicht empfohlen, mehrere Zeilen zu überspringen, um die zu erhalten Ergebnissatz), also verwende ich LastId, um Paging-Abfragen durchzuführen.
Ähnlich der folgenden Aussage:
SELECT columns FROM `table_name` WHERE `created_at` >= 'time range start' AND `created_at` <= 'time range end' AND `id` < LastId ORDER BY `id` DESC LIMIT num
Das obige ist der detaillierte Inhalt vonPHP generiert und lädt Excel-Dateien mit extrem großen Datenmengen in Echtzeit herunter. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.
