php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Scripts > BRAINSTORMING PHP/SQL/HTML/JS/CSS
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


BRAINSTORMING PHP/SQL/HTML/JS/CSS Ihr habt eine Idee, aber keinen genauen Ansatz? Diskutiert mit anderen Usern des Forums über eure Gedankengänge um evtl. hilfreiche Ideen zu bekommen!
Normale Fragen bitte weiterhin in die entsprechenden Foren!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-06-2008, 21:49
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard Große Datenmengen serialisieren und durchschleifen - wie machen?

Für Sepia (In Arbeit.... ) schreibe ich gerade eine Erweiterung, eine Art serialize() und Exportfunktion für einzelne (oder mehrere) Datensätze innerhalb des CMS.

Das heißt, man kann einzelne Datensätze (z.B. Inhaltsseiten) mit allen relevanten Informationen (Erstellungsdatum, Ort in der Baumstruktur, Name, Rechtedatensatz, Ersteller, Darstellungsoptionen) exportieren und bekommt einen Download angeboten, den man dann in einer anderen Sepia-Installation wieder einspielen kann, nicht unähnlich einem SQL-Dump, aber komplexer, weil bis zu 4 Tabellen involviert sind: Der Datensatz selbst, die administrative Seite, die Rechtetabelle und eventuell die zur referentiellen Integrität.

Soweit so machbar.

Jetzt ist es aber so, daß an einem solchen Datensatz Dateien hängen können, z.B. hochgeladene Bilder. Diese müssen mit in den Download gepackt werden, sonst hat die Funktion kaum praktischen Wert.
Es muß eine Datei dabei rauskommen, die ich dann PHP-Seitig wieder auseinandernehmen kann. Kompression ist erstmal zweitrangig.

Die Frage ist nun: Wie gestalte ich das Zusammenpacken mehrerer Dateien mit unbekannter Dateigröße so, daß auch große Mengen von Dateidaten das Memory-Limit nicht sprengen?

Also, kennt ihr eine Methode, mit der ich mehrere Dateien hintereinander öffnen, alle in einem Dateioutput als Download durchschleifen und beim späteren Upload dann wieder auseinanderdröseln kann, unter Nutzung der Dateizeiger, sodaß mein Speicher nie überläuft?

Verpackungsfunktionen wie serialize() kann ich hier ja nicht nutzen, weil diese am Memory-Limit scheitern würden, spätestens wenn eine einzelne Datei größer ist als das Memory-Limit - mit dem Fall muß gerechnet werden, Sepia ist ein sehr robustes System und alles was dazukommt, muß genauso robust sein.

Ist das Problem einigermaßen klar formuliert?
Hat jemand Ideen / Ansätze?
Am ehesten wirds wahrscheinlich etwas sein, was die Dateien hintereinander ausgibt und durch einen vorher festgelegten String trennt. Dafür gibts bestimmt schon was fertiges, was die ganzen Klippen (Kodierungen / CR/LF / und so weiter) schon umschifft hat?

Gibt es ein einfaches Stichwort zum Googeln, auf das ich nicht komme?

Geändert von pekka (09-06-2008 um 21:56 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 09-06-2008, 22:03
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Also ich stelle mir gerade soetwas wie eine MIME-Mail vor. Das käme auch deiner Idee mit der Trennung durch einen vorher festgelegten String nahe.

Allerdings dürftest du da genauso am Speicher scheitern, wie bei anderen großen Dateien, oder?
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #3 (permalink)  
Alt 09-06-2008, 22:06
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Du solltest auf jeden Fall ein festes Dateiformat definieren. Du hast ja im Grunde 3 Arten von Informationen:
  • Die Datensätze
  • Die mit den Datensätzen verknüpften Dateien
  • Metainformationen (Anzahl Datensätze, ...)
Jetzt kannst du dir jedes beliebige bestehende Dateiformat als Vorbild schnappen und dein Format ähnlich gestalten.
(Recht anschaulich finde ich da die Doku zu dem Mo-Dateiformat.)
Oft hast du einige Headerinformationen, die zum Teil die Anzahl Bytes der nachfolgenden Sektionen beinhalten. Dort würde ich auch die Metadaten unterbringen.
Nach dem Auslesen dieses Headerblocks kennst du schon mal die Anzahl Datensätze, Dateien, Dateilängen, etc. D.h. du kannst die Datei sequentiell weiter parsen und nach entsprechender Anzahl von gelesenen Bytes diese Daten behandeln, zum Beispiel die Datensätze in die Tabellen packen oder Dateien auf die Festplatte legen.

Alles serialisiert abzulegen, ist natürlich viel zu Groß. Aber zum Beispiel die Headerinformationen könntest du so recht bequem ablegen. Afaik gibt es da aber ein paar bekannte Overflow-Bugs beim unserialize, so dass das mit Vorsicht zu genießen ist.
Mit Zitat antworten
  #4 (permalink)  
Alt 09-06-2008, 22:10
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Japp, auf ein eigenes Dateiformat wirds wohl rauslaufen!
Die serialisierten Infos + Strukturinformationen kommen mit serialize() in eine Datei. Die "Attachment"-Dateien sind ja schon da. Größen aller Dateien ermitteln, header mit den zu erwartenden Bytepositionen schreiben, und dann mit fread() und echo() durchschleifen bis es fertig ist.

Das probier ich mal! Vor sowas hab ich immer einen Heidenrespekt, weil ich es noch nie probiert habe. Aber ich mache mal und stelle dann hier zur Kritik online

@TobiaZ: Eine MIME-Mail wäre genau das, was ich bräuchte, und würde dazu noch ermöglichen, daß man einzelne Items mailen kann aber es scheitert eben an der Speichergrenze...

Geändert von pekka (09-06-2008 um 22:14 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 09-06-2008, 22:24
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Aber wenn du die Daten zippst, solltest du recht vernünftig damit arbeiten können:

Du kannst alle Dateien im Ursprungsformat belassen, die brauchen dann auch später gar nicht mehr angepackt werden und sollten als einzelnes nicht weiter am Speicher-Limit kauen.
Die Datensätze oder Metadaten lassen sich in Form von Text ja sicher recht gut komprimieren. Und wenn sie dann tatsächlich (in sich) zu groß werden, dann kannst du sie ja locker splitten.

Dann wird es gezippt und mit der Dateiendung .sep gespeichert.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!

Geändert von TobiaZ (09-06-2008 um 22:26 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 10-06-2008, 11:00
eintrachtemil
 Registrierter Benutzer
Links : Onlinestatus : eintrachtemil ist offline
Registriert seit: May 2004
Beiträge: 223
eintrachtemil ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wann darf man denn mit einer Veröffentlichung von deinem CMS rechnen? Bin schon gespannt...

OffTopic:
"...bestehende, statische Websites bin hin zu komplexen,..."

Nur als kurzer Hinweis, da ist ein kleiner Schreibfehler auf deiner deutschen Seite.
Mit Zitat antworten
  #7 (permalink)  
Alt 10-06-2008, 11:04
eintrachtemil
 Registrierter Benutzer
Links : Onlinestatus : eintrachtemil ist offline
Registriert seit: May 2004
Beiträge: 223
eintrachtemil ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Typo3 hat übrigens auch so eine Export-Funktion, die Datensätze und Dateistrukturen/Bilder in eine Datei packt.

Vielleicht kannst du was rausholen.
Mit Zitat antworten
  #8 (permalink)  
Alt 10-06-2008, 14:47
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
OffTopic:
"...bestehende, statische Websites bin hin zu komplexen,..."

Nur als kurzer Hinweis, da ist ein kleiner Schreibfehler auf deiner deutschen Seite.
Mmm? Ich seh keinen?

Zitat:
Original geschrieben von eintrachtemil
Wann darf man denn mit einer Veröffentlichung von deinem CMS rechnen? Bin schon gespannt...
Es sollte eigentlich Mai werden Ich hoffe sehr, daß ich im Juni zu Potte komme. Es ist so, daß es noch ein paar grundlegende Dinge gibt, die ich auf den neuesten Stand bringen möchte, bevor es öffentlich wird. Sonst fangen Leute an, mit dem alten Stand zu spielen und gar Projekte umzusetzen, und man hat einen Riesenaufwand beim Migrieren.

Zitat:
Typo3 hat übrigens auch so eine Export-Funktion, die Datensätze und Dateistrukturen/Bilder in eine Datei packt.
Vielleicht kannst du was rausholen.
Ich versuch mal mein Glück mit dem eigenen Dateiformat, dann sieht man weiter!

Mit Zitat antworten
  #9 (permalink)  
Alt 10-06-2008, 15:01
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

statische Websites bis hin zu komplexen
Mit Zitat antworten
  #10 (permalink)  
Alt 10-06-2008, 15:02
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Upps Danke!
Mit Zitat antworten
  #11 (permalink)  
Alt 11-06-2008, 20:37
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Juhu, Erfolg!
Statt eines proprietären Dateiformats wollte ich letztlich doch unbedingt ZIPs produzieren. Zusammen mit einer XML-Datei für die Datenbankdaten - offener gehts nicht mehr

Der Code selbst ist viel zu Sepia-spezifisch, als daß ihn hier zu posten Sinn machen würde. Aber so hats geklappt:

Diese Zip-Klasse erzeugt Zip-Archive und unterstützt das reine "storen" großer Dateien ohne Kompression.

Im Ursprungszustand erzeugt die Klasse die Zip-Datei on the fly und gibt sie in 1-MB-Blöcken mittels echo() als Dateidownload aus. Dateien kleiner als 20 MB werden mittels gzdeflate() komprimiert, Dateien darüber nicht. Die diesbezügliche Einstellung stellt man für den hier besprochenen Zweck auf 1 Byte, damit nie komprimiert, sondern immer nur ge"stored" wird.

Ich habe die Klasse so erweitert, daß sie statt direkter Ausgabe alternativ mit fwrite() in eine Datei schreibt. Wenn es in der direkten Ausgabe Verzögerungen gibt, stößt das Skript nämlich schneller an das max_execution_time-Limit.

Mit direkter Ausgabe zum Download habe ich auf dem Testserver (WAMP, 512 MB RAM, AMD Sempron 1800+, max_execution_time = 60, memory_limit = 8M) bis zu 60 MB Dateidaten in ein Zip bekommen; Mit Schreiben in eine Datei bis zu 600 MB!!!! Bei 800 war dann Schluß wegen des 60-sekunden-Limits, da stoßen fread() und fwrite() an ihre Grenzen.

Also - das sieht bisher wie eine praxistaugliche und Provider-Kompatible Exportmethode aus, die solide ZIP-Archive produziert und durch den Verzicht auf Kompression nicht mal auf das Vorhandensein der gzip-Funktionen angewiesen ist!

Solche Klassen gibt es bestimmt viele, aber diese hier hat mir gleich gefallen.

Fixes:

Ich mußte in Zeile 343 der zipstream.php das fgets() durch ein fread() ersetzen, davor war die Performance katastrophal. Hab nicht genau geblickt warum aber es ist mir grad auch egal

... und eben das Umschreiben des Outputs von echo() auf fwrite().

EDIT:

Wichtig: Die Checksumme für die ins Archiv gepackten Dateien wird mit der PHP5-Funktion hash_file() und der Methode "CRC32b" gebildet.
Ich habe auf die Schnelle kein PHP4-Workaround gefunden, das eine CRC32b-Checksumme so produziert, daß der Speicher bei großen Dateien nicht überläuft. Im Momentanen Zustand ist das ganze also PHP5 only und abhängig von den Hash-Funktionen, was mich eigentlich ärgert... Mal schauen, ob sich da noch ein Workaround findet.



Geändert von pekka (11-06-2008 um 21:07 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
jQuery Mobile ansehen jQuery Mobile

Touch-Optimized Web Framework für Smartphones & Tablets

09.12.2018 phpler | Kategorie: AJAX/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:23 Uhr.