Piehnat

Ein Blog. Wie früher. Nur heute.

Wenn ein Enter dein CMS lahmlegt

Manchmal sind es nicht die großen Fehler, die einen zur Verzweiflung bringen.

Keine kaputte Datenbank. Kein riesiges Framework mit 500 Fehlermeldungen. Kein spektakulärer Bug.

Manchmal reicht 1 unsichtbares Zeichen.

Ich bastle mir fürn Projekt seit längerer Zeit nen eigenes winziges CMS. Wirklich nichts Großes, einfach PHP, Markdown-Dateien und ein bisschen Code, der daraus eine Website macht.

Keine Datenbank. Keine Plugins. Kein unnötiger Ballast.

Nach ein paar Wochen Arbeit lief alles halbwegs stabil. Beiträge wurden angezeigt, Seiten funktionierten und ich konnte schreiben.

Bis ich meine Startseite ändern wollte. Junge, ich wollte nur nen überflüssigen Buchstaben, der mich triggerte in meiner home.md löschen.

Also Datei angepasst, gespeichert, hochgeladen und Seite geöffnet.

Und dann NICHTS.

Die Struktur war da. Das Menü war da. Die Seite selbst wurde geladen. Aber der Inhalt meiner Startseite war verschwunden.

Natürlich beginnt dann die klassische Fehlersuche.

Cache geleert. Browser gewechselt. PHP angeschaut. Datei überprüft.

Ich habe erst an eine BOM gedacht. Also diese drei unsichtbaren Bytes am Anfang einer UTF-8-Datei, die manchmal für Ärger sorgen können.

Aber Fehlanzeige. Die Datei war sauber und nicht das Problem.

Tja, was machste nun? Die Datei lokal unter Ubuntu prüfen wäre ne Idee.

Mit

file -i home.md

und

xxd -l 20 home.md

Die Datei war korrekt als UTF-8 gespeichert. Keine BOM, keine kaputten Zeichen.

Auch der Inhalt war vorhanden.

Dann habe ich einen kleinen Test gemacht und PHP direkt die Markdown-Datei ausgeben lassen.

Ergebnis: Die Datei konnte problemlos gelesen werden.

Mein CMS fand die Datei also. PHP konnte sie ebenfalls verarbeiten. Der Fehler musste irgendwo danach liegen.

Am Ende lag es an meinem eigenen Code. Wundert mich jetzt nicht, ich mach das nur als Hobby und bin alles andere als ein perfekter Profi, aber ich hab da halt Spaẞ dran.

Meine Startseite wird ungefähr so verarbeitet

$content = file_get_contents($homeFile);
$parts = explode("\n\n", $content, 2);

Mein CMS erwartet also eine leere Zeile zwischen Überschrift und Inhalt.

Das Problem, ich hatte vorausgesetzt, dass meine Markdown-Dateien immer Linux-Zeilenumbrüche verwenden.

Also

\n\n

Der Editor im Strato-Kundenbereich speicherte die Datei aber mit Windows-Zeilenumbrüchen:

\r\n\r\n

Für uns Menschen sieht beides gleich aus

Titel

Text

Für PHP sind es aber unterschiedliche Zeichen. Und genau daran ist mein kleines CMS gescheitert.

Nicht an Markdown. Nicht an UTF-8. Nicht an PHP. An einem unsichtbaren Enter.

Die einfachste Lösung ist eigentlich ziemlich langweilig. Ich bearbeite meine Markdown-Dateien weiterhin lokal und lade sie anschließend per FTP hoch. Der Ubuntu-Editor speichert die Dateien passend für mein CMS.

Zusätzlich könnte ich meinen Code noch etwas robuster machen und statt

explode("\n\n", $content, 2);

eine Variante verwenden, die verschiedene Zeilenenden erkennt

preg_split("/\R\R/", $content, 2);

Dann wäre mein CMS etwas toleranter gegenüber unterschiedlichen Editoren.

Aber am Ende alles cool. Genau deshalb mag ich solche kleinen Projekte.

Bei einem großen CMS hätte ich wahrscheinlich irgendein Plugin gesucht, 47 mal den Cache geleert, 13 verschiedene Browser versucht und sämtliche Foren und Reddit nach der richtigen Einstellung abgegrast.

Hier musste ich verstehen, was wirklich passiert. Eine Markdown-Datei ist am Ende eben doch nicht nur Text. Sie besteht aus Zeichen. Auch aus denen, die man nicht sieht.

Und manchmal entscheidet genau so ein kleines Detail darüber, ob dein Blog läuft oder ob du wie ich heute einen Vormittag lang deinen eigenen Code anstarrst und dich fragst, warum zur Hölle hier nichts mehr funktioniert.

Gebastelt

⬅ Vorheriger Beitrag
Neuer Lesestoff 📚