Problem - Daten - Kunden - Header

Dez 03 2012

Nennt mich Sherlock Holmes!

Kategorie Programmierung


Die letzten Tage war ich (mal wieder) auf der Suche nach der Lösung für ein gar merkwürdiges Problem. Ein Kunde eines Onlineshops meldete sich, dass die Artikelbilder nur zur Hälfte angezeigt werden würden. Nun handelte es sich hierbei um die Art von Shop, wo die Artikelbilder das Hauptargument für die Entscheidung für einen Kauf sind. Erschwerend kam die Tatsache hinzu, dass das Weihnachtsgeschäft zusätzlichen Druck aufbaute. Ein klarer Fall für jemanden, gegen den der große Sherlock Holmes ein blutiger Anfänger bei der Problemanalyse ist: Mich! 😉

Der Fall:
Bilder wurden nur zum Teil geladen. Ein Teil des Bildes war in Ordnung. Der Rest „fehlte“ bzw. war vielmehr transparent. Dieser „Effekt“ trat nur bei einigen Kunden auf. Keine Hinweise auf spezielle das Problem verursachende Browser- oder Systemkonstellation auf der Kundenseite. Kein Javascript war im Spiel, sondern pures durch PHP generiertes HTML. Dummerweise war das Problem an keinem greifbaren Rechner reproduzierbar. Da sich mittlerweile auch noch mehr Kunden mit dem gleichen Problem gemeldet hatten und erste Screenshots geliefert wurden, konnte man auch den erhofften Einzelfall ausschließen.

Die Problemlösung:
Wie löst man ein nicht reproduzierbares Problem – also eines, welches man im Grunde nicht hat? Richtig – man greift zum Deerstalker, wirft sich den Inverness-Mantel über, steckt sich eine Pfeife an und sammelt gleich dem großen Meister Indizien.

1. Kürzlich gemachte Änderungen am System
Es gab keine signifikante Änderung am System. Keine Aktualisierung irgendwelcher Komponenten.

2. Die Server-Logs:
Webserver sind sehr gesprächige Zeitgenossen. Jede Anfrage wird genauestens protokolliert. Von den einen verteufelt, weil sie Angst davor haben, zu viele Spuren zu hinterlassen. Für andere ein unerlässliches Mittel zur Indiziensuche bei Problemen. In meinem Fall zeigten sich leider gar keine Auffälligkeiten. Die Bilder wurden (nach Meinung des Servers) zu jeder Zeit korrekt und vollständig ausgeliefert.

3. Tritt das Problem in anderen baugleichen Umgebungen auf?
Eine Nachfrage beim Kunden ergab: Nicht nur ein Shop war betroffen – sondern alle! Verdammt!!!

4. Das Problem liegt vermutlich nicht bei uns.
Was, wenn das Problem erst bei der Übermittlung der Daten von unseren Servern zum Browser des Clients auftritt? Vielleicht ein Caching-Problem eines Internet-Providers? Selbst wenn dem so wäre: unbefriedigend!

5. Die Verteilung der Daten auf verschiedenen Hosts
Eine Möglichkeit, die Geschwindigkeit von Webseiten zu verbessern, ist das Ablegen der Daten bzw. der Zugriff auf dieselben über verschiedene Hosts. Der Browser kann dadurch parallel sehr viel mehr Daten gleichzeitig laden, was den Aufbau der Seite spürbar beschleunigt. Gibt es hiermit vielleicht ein Problem? Unwahrscheinlich zwar, aber nicht unmöglich. Also dem Round Robin mal eine Pause gegönnt und den Kunden nochmals kontaktiert. Ergebnis: Keine Besserung.

6. Verzweiflung
Bei Kaffee und Kuchen (hier unterscheide ich mich vom Großmeister der Recherche, der griff in solchen Phasen eher zu Kokain) weitere größtenteils absurde Szenarien durchgespielt und keinen Schritt weiter gekommen.

7. Der erste Ansatz
Was ist bei der HTTP-Datenübermittlung im Internet ein nicht so ohne weiteres sichtbares aber dennoch unverzichtbares Beiwerk? Richtig: Der Header. Schauen wir uns doch mal den Header der gesendeten Bilder an:

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Mon, 03 Dec 2012 19:25:56 GMT
Content-Type: image/jpeg
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.4-9
Last-Modified: Fri, 26 Oct 2012 13:00:13 GMT
Expires: Wed, 02 Jan 2013 19:25:56 GMT
Content-Disposition: inline; filename=artikelbild.jpg

Auf den ersten Blick keinerlei Auffälligkeiten. Wobei: Das Bild wird mit Hilfe eines PHP-Scripts ausgeliefert. Der Header ist also nicht jener, welcher bei einem „normalen“ Bild-Request gesendet wird. Schauen wir uns mal im Vergleich dazu den Header eines solchen Bildes an:

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Mon, 03 Dec 2012 19:30:04 GMT
Content-Type: image/png
Content-Length: 2489
Last-Modified: Mon, 08 Nov 2010 10:10:16 GMT
Connection: keep-alive
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000, public
Accept-Ranges: bytes

AHA! Das geschulte Holzauge erkennt hier tatsächlich einen für das Problem möglicherweise ursächlichen Unterschied. Bei den „Problembildern“ wird im Header keine Dateigröße (Content-Length) gesendet. Der Webserver bastelt hier unfreundlicherweise direkt ein „Transfer-Encoding: chunked“ mit rein. Das bedeutet nichts anderes, als dass die Daten in kleine Stückchen filetiert übertragen werden. Möglicherweise gibt es hier eine Wechselwirkung auf dem Weg vom Server zum Client, so dass der Client nur einen Teil der Daten erhält. Was auch wiederum erklären würde, warum das Problem nur punktuell auftritt.
8. Die erhoffte Lösung:

header(„Content-length: „.filesize($file));

9. Die Nachfrage beim Kunden
Mit einem großzügigen Gutschein in der Hand winkend nochmals beim Kunden nachgefragt, ob er die Seite nochmals aufrufen könnte. Gleichzeitig noch einen Link zu einer fix zusammengeschusterten Testseite zum Zwecke der Untersuchung weiterer möglicher in Punkt 6 erdachter Probleme mitgeschickt.

10. Feierabend
Nach wenigen Minuten eine Mail mit dem Betreff „Entwarnung“ erhalten. Puh – Problem gelöst. Warum dieses jedoch erst heute aufgetreten ist, ist mir ein Rätsel. Vielleicht hat aber auch irgendein Provider klammheimlich etwas umgestellt, ohne mich zu informieren. Sollte jemand ähnliche Probleme haben, kann er sich gern bei seiner Problemlösung an dieser Stelle inspirieren lassen.

5 Kommentare

5 Kommentare zu “Nennt mich Sherlock Holmes!”

  1. Enricoam 03. Dez 2012 um 21:09 Uhr

    So einfach kommt man bei euch also an einen „großzügigen Gutschein“ 😉

  2. blechkoppam 03. Dez 2012 um 21:18 Uhr

    Eine bessere Kundenbindung kann es nicht geben. Das nächste Mal ziehen wir das viel größer auf, versprochen! 😉

    Außerdem brauchen wir noch einen Firmenblog für uns „Technik-Fuzzis“ und derartig spannende Geschichten. Ich würde meine runzlige Vorhaut darauf verwetten, dass der deutlich mehr Anklang in der Szene findet, als unser Shop-Blog.

  3. Wolfam 04. Dez 2012 um 09:51 Uhr

    Cool. Vor allem Punkt 6. kann ich gut nachvollziehen. Wobei ich auch noch eine zusätzliche Phase „Zweifel am eigenen Verstand“ kenne. Z. B. bei folgendem Szenario: Ein Tool, das seit Monaten funktioniert, tut das plötzlich nicht mehr. Ich sehe mir den Code an und finde eine völlig logische Erklärung für die Fehlfunktion. Aus irgend einem Grund sehe ich in einer alten Version nach: derselbe Fehler auch dort … Es hätte theoretisch noch nie funktionieren können … Weiß bis heute nicht, was da los war. Ein Riß in der Matrix?

  4. Sunnyam 04. Dez 2012 um 14:09 Uhr

    Ähm, die runzelige Vorhaut lassen wir mal schön da, wo sie ist…

  5. blechkoppam 04. Dez 2012 um 22:07 Uhr

    @Wolf: „Zweifel am eigenen Verstand“ sind Grundvoraussetzung für eine derartige Problemanalyse
    @Sunny: Ich würde derartiges nicht in die Waagschale werfen, wenn ich mir nicht hundertprozentig sicher wäre! 😛

Einen Kommentar hinterlassen


Spammen zwecklos!
Lediglich zum Zwecke der Linkverbreitung abgegebene Kommentare werden kommentarlos gelöscht!