Wie die Übergabe SEHR Großen Strings in PHP Bei der Generierung einer PDF
Habe ich einen Bericht, den Sie generieren über 30.000 Datensätze, wenn gegeben, einen ausreichend großen Zeitraum. Aus der HTML-Seite der Dinge, eine resultset-das große ist kein problem, da ich implementieren Sie eine Paginierung system, dass die Grenzen der sichtbaren Ergebnisse um 100 zu einem bestimmten Zeitpunkt.
Mein eigentliches problem tritt auf, sobald der Benutzer drückt die "Get PDF" - button. Wenn dies geschieht, habe ich im wesentlichen re-run der Teil des Berichts, der Drucke die Daten (die Ergebnisse der Bericht selbst gespeichert werden, in einer "speichern" - Tabelle, so gibt es keine Notwendigkeit, re-run das sammeln von Daten und Logik), und speichern Sie die Ergebnisse in eine variable namens $html
. Beachten Sie, dass diese variable enthält jetzt als 30.000 Datensätze von Daten sowie die notwendige HTML zu formatieren Sie ihn korrekt in die PDF-Datei. Einmal habe ich diesen HTML-string erstellt, ich gebe es zu TCPDF um zu versuchen und erzeugen Sie die PDF-Datei für den Benutzer. Anstatt jedoch auf die Erzeugung der PDF-Datei, es ist nur scheißt, ohne eine Fehlermeldung ("Erzeugung von PDf -...') dialog verschwindet und das system verhält sich wie Sie nie gebeten, es zu tun.
Durch tests habe ich herausgefunden, dass das problem liegt in der Größe der $html
variable weitergegeben werden. Wenn Sie den Bericht unter dem 3K-Datensätzen, es funktioniert gut. Wenn es vorbei ist, ist der HTML-Seite des Berichts gedruckt wird, aber nicht das PDF.
Hilfreiche Info
- PHP 5.3
- TCPDF zur PDF-Generierung (auch versucht PS2PDF)
- Skript Memory Limit: 500 MB
Wie würden Sie Jungs Griff der Umfang der Daten, die bei der Erzeugung einer PDF-Datei von dieser Größe?
InformationsquelleAutor Levi Hackwith | 2010-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
TCPDF scheint werden eine native Implementierung der PDF-Erstellung in PHP. Sie können haben eine bessere Leistung durch die Verwendung einer kompilierten Bibliothek, wie PDFlib oder eine Kommandozeilen-app, wie htmldoc. Letztere habe die besten Chancen, um eine große PDF-Datei.
Außerdem sind Sie brechen die Ausgabe-PDF-Datei in mehrere Seiten? I. e. tut TCPDF wissen, nehmen Sie ein einzelnes HTML-Dokument, und schneiden Sie es in mehrere Seiten, oder Sie erzeugen von mehreren HTML-Dateien für Sie zu kombinieren in einem einzigen PDF-Dokument? Das kann auch helfen.
$html
variable.Hackwith: Das macht keinen Sinn. PDF-Dateien können so groß sein wie Sie wollen. Wenn eine PDF-Generators schlägt fehl, wenn seine Eingabe von HTML ist zu groß, dann ist das ein problem mit dem generator. Ansonsten, nur reduzieren Sie die Größe Ihrer HTML-Datei und erstellen Sie viele kleine PDF-Dateien wie shamittomar schlägt. Obwohl die meisten desktop-Programme haben kein problem, das erstellen von PDFs mit 100.000 Seiten.
So ist es allgemeiner Konsens, dass die Probleme liegt in TCPDF, nicht von PHP selbst?
Hackwith: es sei denn, das Skript wird über die maximale script Ausführungszeit oder Skript memory limit, es ist unwahrscheinlich, dass ein problem mit PHP. Ich habe auch sehr bezweifle, dass Sie brauchen mehr als 500MB zum generieren einer PDF-Datei, es sei denn, jeder Datensatz selbst ist riesig. Aber Sie können immer überprüfen mit
memory_get_peak_usage()
.bekommt die Antwort, da er vorgeschlagen, das ganze "command line" - Ansatz, die gehen, um die beste Weg, dies zu behandeln
InformationsquelleAutor Lèse majesté
Hier ist, wie ich dieses Problem gelöst: ich habe bemerkt, dass einige der Zeichenfolgen, die ich hatte in meiner HTML-Ausgabe hatte einige leichte Probleme der Zeichenkodierung - ich lief htmlentities auf diesen besonderen Zeichenfolgen wie ich das Abfragen der Datenbank für Sie und klärte das problem.
Weiß nicht, ob dies war, was die Ursache Ihres Problems, aber meine Erfahrung war sehr ähnlich - wenn ich versuche, die Ausgabe einer HTML-Tabelle, die hatten eine große Größe, mit über 80.000 Zeilen TCPDF würde der Kopf der Seite angezeigt aber nichts-Tabelle verknüpft sind. Dieses Verhalten wäre das gleiche mit verschiedenen Daten-sets und verschiedene Tisch-Strukturen.
Nach vielen versuchen begann ich hinzufügen, meine eigene Seitenzählung - alle 15 Zeilen, ich würde brechen der Seite, und fügen Sie eine neue Tabelle auf der folgenden Seite. Das ist, wenn ich bemerkte, dass jeder einmal und eine Weile würde ich in die leeren Seiten zwischen eine Menge der vollständigen und richtigen sind. Da merkte ich, dass es ein problem mit diesen bestimmten subsets von Daten, und entdeckt die encoding-Problem. Es kann sein, dass Sie hatte so etwas ähnliches und TCPDF war nicht klar, was Ihr problem war.
InformationsquelleAutor Petre Pătraşc
Sind Sie mit der writeHTML-Methode?
Ging ich durch die Leistung der Empfehlungen hier: http://www.tcpdf.org/performances.php
Heißt es "teilen Sie große HTML-Blöcke in kleinere Stücke;".
Fand ich, dass, wenn mein HTML-Codeblöcke ging über 20.000 Zeichen der PDF-Datei nehmen würde, gut über 2 Minuten zu generieren.
Ich einfach split mein html bis in die Blöcke und rief writeHTML für jeden block, und es dramatisch verbessert. Eine Datei, die nicht erzeugen, Sie in 2 Minuten bevor jetzt dauert 16 Sekunden.
InformationsquelleAutor Jonny White
Ich würde brechen die PDF-Datei in teilen, ebenso wie Paginierung.
1) "Get PDF" - button auf jeder paginierten HTML-Seite und ermöglichen das herunterladen von Datensätzen aus dieser HTML-Seite nur.
2) Begrenzen Sie die maximale Anzahl der Datensätze, die heruntergeladen werden können. Wenn die Obergrenze erreicht ist, teilen Sie die PDF-Datei und lassen Sie die Benutzer herunterladen, um mehrere PDF-Dateien.
InformationsquelleAutor shamittomar