Hi Horst,
kann man z.B. alle 50 (oder später 100) Textdateien auch in _ein_ multidimensionales Array lesen
(z.B. index => array('überschrift','dateiname','dateiinhalt')), und das das Ganze dann sortierbar und durchsuchbar ist?Also, alles in akzeptabler Zeit und Prozessorlast usw., wenn man von so einem 'allerwelts-php-account' ausgeht wie ich ihn habe (also max 8mb speicher und so weiter). Wenn ja, dann wäre das ja wirklich eine wunderbare Möglichkeit eine Suchfunktion für kleine Seiten zu erstellen.
Ja, bei 100 Datensätzen sehe ich da kein Problem. Bei 1000Sätzen mit 1000 Bytes (Nutzvolumen) wird man sicher bald an die magische Speichergrenze von 8MB stoßen, denn man benötigt ja einigen Overhead und Platz zum Umstapeln der Daten. Ich würde mal schätzen, dass die Sortierfunktionen von PHP ungefähr viermal soviel Platz benötigen, wie die zu sortierende Datenmenge groß ist. Dann würde man also immer noch 2000 Sätze à 1000 Bytes in einer solchen Flat-File-Lösung unterbringen können.
Auf einem Linux/Unix-Server, auf dem man Sequentielle Dateien, also Dateien mit variabler Satzlänge, abgelegt hat, zählt PHP die Anzahl der Sätze in Nullkomma-Nix. Auf einem Windows-Server für PHP (Gleiche Maschine) dauert das ewig. Ich habe nun noch nicht herausgefunden, wieso die Weiterschaltung Satz für Satz bei Linux so affenschnell ist und bei Windows so langsam. <i>Muss wohl an den Brems-Verträgen mit der Prozessorindustrie liegen</i>
Zu beachten sind eigentlich nur zwei Dinge: Man muss die harten Returns aus dem Datenstrom eines Datensatzes entfernen. Ich tausche sie immer gegen #127. Die Felder kann man gut mit #004-Zeichen voneinander trennen. Auf diese Weise kann man mit der Funktion file() arbeiten.
In jeder Zeile steht dann ein Datensatz + LF
datenfeld-4---datenfeld----4--df--4---datenfeld----------A
df4--datenfeld--4--df--A
------datenfeld---------4----7F--7F--datenfeld-7F---A
Ich habe die Sätze nun untereinander geschrieben. In der Datei gibt es kein untereinander, sondern alle Daten leigen sequentiell hintereinander. Das A symbolisiert dabei immer das Ende eines Satzes, während die 4 der Trenner zwischen den Sätzen ist. die 7F (als EIN Zeichen) symbolisiert die Zeilenschaltung z.B. in einem Textfeld.
Man muss natürlich dafür sorgen, dass weder
Dez Hex Bedeutung
#010 0A Satzende ("Zeilenende" der Textdatei)
#004 04 Feldtrenner im Datensatz
#127 7F Zeilenschaltung im Datenfeld
in den Nutzdaten enthalten sind.
So hat das bisher immer gut funktioniert. Das Sortieren der Daten überlässt man dann den Arrayfunktionen von PHP. Anschließend kann man die gesamte Datei auch in der neuen Sortierung und mit Einfügungen zurückschreiben.
Leider unterstützt PHP in den mir bekannten Versionen noch keine Dateien mit fester Satzlänge und fester Satzstruktur (Record / Structure). Dann könnte man das ganze (zu Lasten des Speicherplatzes auf der HDD) noch erheblich schneller machen.
Wenn noch Fragen bestehen, schreib sie hier. Vielleicht basteln wir dann zusmamen mal einen Datei-Baukasten für PHP. So aus dem handgelenk fällt mir nicht ein, welche Funktionen man alles brauchen würde.
Liebe Grüße
Tom