Fabian Transchel: HTML code auf einer HTML Seite anzeigen

Beitrag lesen

Hallo Fabi,

Nabend Tom,
bin schon froh, dass ich noch zum antworten komme, hatte heute nen ganzen Computer zu formatieren und neu aufzuspielen. (Das Problem war, dass das mein DSL-Server war ;-))

jetzt geb ich meinen Senf auch noch dazu:

tu das, ich werde es auch machen. *forumzusenf*

ich hab noch etwas Ketchup...

ah ja...
use Mayo(active);

fread liest die Datei binär ein, das heißt blockoreintiert und nicht Zeilenweise. Ein Blocktreiber ist sehr nah an der Hardware und daher sehr schnell.

$fp= fopen("datei","r");
$DateiInhalt = fread($fp,filesize("datei"));
fclose($fp);

$DateiInhalt = htmlspecialchars($DateiInhalt);
echo $DateiInhalt;

och nö... das haben wir doch gestern erst hier durchgekaut.
man muss

file() liest die Datei textorientiert ein, das heißt, innerhalb eines Blocktreibers (der immer benötigt wird) läuft ein zweiter "Blockprozess" für jede Zeile ab. Die Datei wird vom Treiber also gelesen und ausgewertet, um die Zeilenendezeichen zu finden. Eine solche Stringvergleichsoperation kostet sehr viel Zeit.

Mit File wird die Datei zeilenweise in ein Array eingelesen. Jede Zeile der Datei (abgeschlossen durch ein [CR]LF) wird in ein eigenes Array-Element geschrieben.

$daten = file("datei");

$ganzesfile = implode('',$daten); // Zeile geändert, ich hatte es tatsächlich übersehen.

$ganzesfile = htmlspecialchars($ganzesfile);
echo $ganzesfile;

Ich halte es nicht für sinnvoll, die Datei erst in Zeilen zu zerlegen, um sie dann anschließend mit implode() wieder zusammenzusetzen. Dann kann man sie doch gleich am Stück verarbeiten, gelle?

ja. aber wart mal ab, was ich weiter unten meine... =)

nicht ganz. bleibt die überaus philosofische frage, was denn nun schneller ist >;)

Na, meine Version natürlich. Ich würde mal schätzen, dass die weniger als halbsolange braucht. Die meiste Zeit brauchen sowieso die Stringoperationen von htmlspecialchars(): Für jede auszutauschende Zeichengruppe ein Durchlauf Suchen, Datei umkopieren um Platz fürs Einfügen zu schaffen, Einfügen, nächstes Zeichen.

mhh, muss denn die Variable, die zwar byteorientiert eingelesen wird, was schneller ist, nun in (Ascii-)Text umgewandelt werden? Wenn ja, so wäre die Performance wieder ausgeglichen, mit dem geringen Vorsprung des array-implodens.

Könnte auch so ablaufen, dass die Datei einmal umkopiert wird und währenddessen alle zu tauschenden Zeichenketten gescuht werden. Immer, wenn eine auftaucht, wird si erkannt und ausgetasucht. Dann muss man aber die Zeichen der Datei mit einem Set (Menge von Zeichen) vergelichen, und das kostet auch Takte und damit Zeit. Dafür könnte man nun Schicht für Schicht (im Sprachmodell) eine Übertragungsfunktion aufstellen und das ganze berechenbar machen.

da fällt mir ein, wenn man htmlspecialchars() auf den array anwendet _könnte_ das schneller gehen, weil ja die zu kopierenden blöcke(sprich zeilen) wesentlich kleiner sind. das is'n versuch wert.

Das lohnt sich aber nur bei sehr großen Dateien, da bei kleinen die Zugriffszeit des Dateisystems (Festplatte 5 bis 12ms, je nach Qualität) für den Erstzugriff auf die Datei überwiegt. Die Abarbeitung bewegt sich stattdessen im Nanosekundenbereiceh.

zustimmung hierbei. wenn ich ne 12ms-platte hab isses wurscht, wie ich es mache ;-)

So, das war ne ganze Flasche...

sieh zu, dass du das Forum auch wieder sauber machst...

Fabian
[mayo]