Archiv für Juli 2006

Benutzer-Interface

Montag, 31. Juli 2006

Dazu gibt es ab sofort hier eine Abstimmung.

Neuer Mailparser

Sonntag, 23. Juli 2006

Auch das Problem, dass zu große Mails nicht gelesen werden können, wenn PHP durch den Webhoster nicht genug Arbeitsspeicher zugeteilt ist, soll mit b1gMail7 beseitigt werden. Grund für das Problem ist der Mailparser, der den Mailquelltext liest, verarbeitet und in seine Teile (Anlagen) zerlegt und decodiert.

Bis b1gMail7 wurde hierzu die MimeDecode-Klasse von Richard Heyes verwendet, die auch an sich wunderbar funktioniert. Die Arbeitsweise der Klasse hat jedoch einen wesentlichen Nachteil:

Erstmal wird die ganze Mail aus der Datei in den Arbeitsspeicher geladen, dann wird die Mail durch die Klasse verarbeitet; jede decodierte Anlage wird im Speicher auf einmal decodiert, sodass beim Decodieren ein großer RAM-Verbrauch entsteht, der oft weit über die Mailgröße hinausgeht. Das geht so lange gut, bis mehr RAM angefordert wird, als PHP zuteilen darf – dann kommt es zu den beobachteten Fehlermeldungen. Die Lösung dazu ist, das Speicherlimit (memory_limit) von PHP zu erhöhen. Das ist leider jedoch meist nur mit eigenem Rootserver möglich.

Die für b1gMail7 neu entwickelte MailParser-Klasse verfolgt einen anderen Ansatz: Die Mail wird als Datei geöffnet und wird Zeile für Zeile ausgelesen. Jede Zeile wird verarbeitet, beim Erreichen der nächsten Zeile wird der Speicher der alten Zeile wieder freigegeben. Die Anlagen der Mail werden beim Parsen der Mailstruktur noch nicht decodiert und belegen damit keinen Speicher – die Klasse speichert aber, an welcher Position die Anlagen in der Maildatei liegen und wie groß diese sind.

Will der Benutzer nun eine Anlage ansehen oder herunterladen, wird nicht – wie bisher – die gesamte Mail in den Speicher gelesen und die ganze Anlage decodiert, sondern die Mail geöffnet und zur vorher gespeicherten Position der Anlage gesprungen. Dann wird die Anlage in kleinen Blöcken Stück für Stück ausgelesen. Jeder einzelne Block wird decodiert und an den Browser geschickt, der Speicher des Blocks wird daraufhin sofort wieder freigegeben. Somit können theoretisch auch sehr große Mails mit sehr wenig RAM-Verbrauch geparst werden.

Zum Vergleich hier der gemessene Speicherverbrauch des alten und des neuen Mailparsers nach Parsen einer 280 KB großen E-Mail. Der Speicherverbrauch mit dem neuen Mailparser liegt bei 160KB, also noch unter der größe der E-Mail selbst!

Vergleich Mailparser

Dennoch sollte man bedenken, dass E-Mails ursprünglich nicht für den Versand von Dateien, sondern für Texte ausgelegt wurden. Beim Versand binärer Anlagen (z.B. Bilder, Musik, ZIP-Dateien usw.) muss jede Datei erst in ASCII-Text umgewandelt werden und wird dadurch meist ca. 33% größer. Größere Dateien sollten also am Besten per FTP oder auch per HTTP übertragen werden. Und die Webdisk-Freigaben gibt’s ja auch noch 😉

Der liebe InternetExplorer…

Samstag, 01. Juli 2006

Nach etlichen Kämpfen mit den „aussagekräftigen“ Debug-Hinweisen des InternetExplorers und der „etwas“ eigenwilligen Auslegung der Standards funktioniert der aktuelle Stand von b1gMail7 nun auch im InternetExplorer korrekt.

Schade, dass der Browser so viel Verbreitung gefunden hat. Das macht einem echt das Leben schwer – während der Code in allen anderen Browsern (Opera, Firefox/Camino, Safari/Konqueror usw.) korrekt funktioniert, muss man für den InternetExplorer wieder Extracode schreiben und/oder Browserweichen basteln.

Ob das ganze dann auch im InternetExplorer7 korrekt angezeigt wird, muss ich noch testen… Ich befürchte aber, dass wieder Weichen eingebaut werden müssen.

Danke, Redmond!