Hello,
Wie mache ich das am besten?
Ganz anders!
Das ist ja schon mal sehr aufschlussreich *g*
Ja, anders ist eben nicht "wie es alle machen"...
Wenn ich meinen Artikel zum Safe Mode fertig habe, widme ich mich dem lange versprochenen "Speichern in Flat-Files".
Nur soviel vorab.
Schön. Ich habe mir da jetzt auch mal das http://selfhtml.bitworks.de/speichern.php angesehen, was ja wohl hierzu passt, oder?
Ja, ein wenig schon. Da habe ich eine ähnliche Technik eingesetzt. Allerdings gibt es da nicht mehrere "Datensätze", sondern eben nur einen einzigen.
Stellst du dir das als ein Array vor, in dem alle Einträge sind, oder für jeden Eintrag ein Array?
Man kann, wenn man nicht wieder Stress haben will, nur _ein_ Superarray aufbauen und nicht eines für jeden Datensatz, da man sonst ja wieder Probleme mit den Satzendezeichen bekommt. Ein CRLF (als Beispiel) könnte ja auch im Array wieder als Datenwert vorkommen.
Da die Länge der Datensätze bei PHP-"Arrays" absolut wahlfrei ist, weiß man dann nicht, wo ein Satz zuende ist. Man muss also sowieso die gesamte Datei sperren, einlesen, verarbeiten, zurückschreiben und wieder freigeben.
Damit würde das ganze Array dann in einer Textdatei in einer Zeile stehen? Richtig?
Richtig. Da es sich ja nicht mehr um eine Textdatei handelt, sondern eine "formatfreie Binärdatei" (das Format ist nur implizit vorhanden und kann bei jedem update wechseln), gibt es keine "Zeilen".
Und einlesen würde man das ganze mit fopen() und fread() (nicht mit file, weil ja die Zeilen keine rolle spielen) und dann wieder unserializeieren?
Öffnen mit fopen(...,'a+') -> Zerstörungsfrei
Sperren mit flock()
Satzzeiger auf Anfang mit fseek()
Vollständig einlesen mit fread()
unserialize()
Änderungen vornehmen im Array() <<== darum geht es dabei nur!
Das ist nämlich bequem.
serialize()
Satzzeiger auf Anfang mit fseek()
schreiben mit fwrite()
Trimmen mit ftruncate()
Schließen mit fclose(), das flock(...,LOCK_UN) kann man sich schenken.
Und nun darf der nächste...
Der oben beschriebene Vorgang dauert selbst bei 2MB großen Dateien mit ca. 1000 Datensätzen nicht länger als 1sec, es sei denn, Du hast den Apachen auf nem 386er mit 8MB installiert *gg*.
Man muss sich eigentlich nur über das Locking wirkliche Gedanken machen. Alles andee ist Billigprogrammierung.
Ähm ....... richtig!
Habe ich eigentlich oben ausreichend beschrieben, wie es richtig[tm] gemacht wird.
Wenn ja, dann kannst Du ja den Co-Autor bei "Speichern in Flat-Files" machen.
Hey, da hätt ich doch sogar noch meinen Spaß dran :-)
Schön. Denn da müssen wir ja alle Methoden vorstellen, auch wenn sie eigentlich nur von Harry benutzt werden *zyn,zyn*.
Schau Dir mal http://selfhtml.bitworks.de Safe Mode an, ob man das verstehen kann. Das ist zu ca. 1/4 fertig. Die Tools und Tipps und Tests fehlen noch. Und die Scripte dazu.
Das hat jetzt aber nichts mit meinem Problem zu tun - oder liege ich da etwa falsch?
Nee, das war nur wegen Co-Autor, weil ich die Sachen ja manchmal recht überwändlich ausdrücke...
Hm, ich habs noch nicht alles durchgelesen, mehr überflogen, aber es scheint doch recht verstädnlich zu sein.
Vielleicht fehlt noch ein bisschen über das eigentliche Wirken von SafeMode - was kann zum Beispiel passieren, wenn dieser nicht aktiviert ist etc.
Siehst Du, da haben wir doch den Nutzen eines Co-Autors schon. So muss das dann auch bei den Dateien laufen.
In der Art sollte auch das "Wegschreiben und Holen" stattfinden.
Was du anderweitig als "Speichern in Flat-Files" beschreibst ;-)
Genau.
Noch was zu einem wesentlichen Vorteil der objektorientierten Speicherung der Daten: Du kannst auch klassenverweise mit abspeichern, Anzeigefunktionen, Prüffunktionen, etc. Du kannst in einem Datensatz kein Bild speichern un im nächsten drei, bzw. die Referenzen darauf. Die Bilder gehören nicht in die Datei, da sie vom Anzeigeprogramm sowieso "lose" benötigt werden. Du musst beim Design des Arrays eben immer nur genau überlegen, ob Du das Teilobjekt als einweriges oder als (mögliches) mehrwertiges anlegst.
Ich hatt ja so eine Struktur schon angedeutet. Übrigens könnte nun die Frage kommen, ob man die Arrays assoziativ oder indiziert aufbauen sollte. Angesichts der Vorteile beim Zugriff über Namen und der monströsen Hauptspeicher und Festplatten plädiedre ich für assoziative Arrays. Wenn nämlich in einem Datensatz ein Teilobjekt nicht vorkommt, kostet es auch keinen Platz. Man muss nun nur seine Bearbeitungsfunktionen so erziehen, dass die eben immer vorher gucken... muss ich nun ein gBild anzeigen oder keins oder fünf Foreach() machts möglich.
Nun will ich aber hier nicht das ganze Script in ein Posting schreiben. Ich hoffe aber, dass Du es mit Ikea halten kannst jetzt: EEntdecke die Möglichkeiten"
Liebe Grüße aus http://www.braunschweig.de
Tom
[ Computer-Camp für PHP-Anwender in den Sommerferien. Programmieren,
Sport, Fun, Fete. Teilnehmermindestalter Gruppe 1: 14 Jahre
Mindestalter Gruppe 2+3 18 Jahre, Info bei mir ]
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen