Beim Magento Hackathon Zürich 2014 haben Dima Janzen von Mash2 und ich uns ein altes Thema aus der „Projektideen“-Liste ausgesucht, „Visualize reindexing“ (Danke an Tim Bezhashvyly für den Vorschlag!). Das Team, das es letztes Mal angefangen hatte, zu implementieren, sagte uns, dass es keinen vernünftigen Weg gibt, den Fortschritt von verarbeiteten Index-Events zu bestimmen, was auch unser erster Ansatz gewesen wäre. Also kamen wir auf einen anderen Ansatz: Schätzen der Gesamtlaufzeit pro Indexer, basierend auf vorherigen Laufzeiten, so wie es zum Beispiel auch Buildserver machen.

Glücklicherweise sind diese Daten einfach auszulesen, Magento speichert bereits Startzeit und Endzeit des aktuellen/letzten Laufs in der Datenbank-Tabelle „index_process“, wir mussten sie nur in einer zweiten Tabelle persistieren, um den Verlauf zu sehen.

Dann war der Großteil der Arbeit, ein schönes User Interface drumherum zu bauen. Die wichtigen Ziele dabei waren:

  • Unaufdringliche Integration ins Indexer Grid
  • Information in Echtzeit

Die Extension fügt eine Spalte zur Indexer-Liste hinzu, die die durchschnittliche Laufzeit für jeden Indexer zeigt. Wenn der Indexer gerade läuft, ändert sich die Spalte zu einem Fortschrittsbalken mit geschätzter verbleibender Dauer, oder wenn die Zeit überschritten ist, der Zeit über der Schätzung.

Screenshot 4: Finished Screenshot 3: Overtime Screenshot 2: Running Screenshot 1: Initializing

Beim Reindizieren im Admin Interface kann es sein, dass man völlig blockiert ist, irgendetwas anderes zu tun, so lange der Indexer läuft. Das hat zwei Gründe:

  1. Es ist ein normaler Link (oder abgesendetes Formular bei mehreren Indexern) und der ganze Prozess läuft innerhalb dieses Requests. Also lädt der Browser für lange Zeit eine neue Seite und in der Zwischenzeit bekommt man keinerlei Feedback.
  2. Zu Beginn dieses Requests wird die Admin-Session geöffnet und bleibt offen, bis der Prozess beendet ist und die Antwort gesendet wurde. Bei dateibasierten Sessions (dem Standard), wird die Datei gelockt so lange sie offen ist und kein anderer Prozess darf sie in der Zwischenzeit öffnen. Das heißt: auch beim Öffnen des Backends in einem anderen Fenster wird man eine weiße Seite sehen, die ohne Ausgabe lädt, bis der Indexer fertig ist.

Um Problem (1) zu lösen, nutzen wir AJAX Controller für die Reindex Actions, so dass man die gewohnte „Bitte warten…“ Ladeanimation zu sehen bekommt, während der Reindex-Request im Hintergrund läuft. Damit blieb Problem (2), was sehr wichtig für uns war, da wir den Server von Zeit zu Zeit nach einem Status-Update fragen wollten und diese Reqeusts blockiert wären, bis alles fertig ist, womit sie zwecklos wären.

Also, was taten wir? Die Session schließen, sobald wir nicht mehr von ihr lesen oder schreiben mussten. Das ist genaugenommen direkt zu Beginn der jeweiligen Controller Action, weil an diesem Punkt die Autorisation bereits abgeschlossen ist und keine anderen Parameter aus der Session benötigt werden. Wir brauchen auch keine Erfolgs- oder Fehlermeldungen in die Session zu schreiben, da uns diese bei AJAX Requests ohnehin nichts bringen und wir die Meldungen als JSON Response zurückgeben.

Aktueller Stand

Ich habe an der Extension nach dem Hackathon weitergearbeitet und mittlerweile ist sie in mehreren Magento-Shops im Produktiv-Einsatz. Dennoch gibt es mehr Ideen als Zeit, sie zu implementieren.

Weiterentwicklung

Die Statistiken werden nur fürs vollständige Reindizieren gesammelt. Partielles Reindizieren von Indexern, die auf „Update beim Speichern“ stehen oder von Magento Enterprise wird nicht berücksichtigt, so dass die Schätzungen nicht akkurat sind, wenn ein partieller Index-Prozess läuft.

Volle Kompatibilität zu Magento Enterprise ist auch noch auf der Liste der Dinge, die wir gerne hinzufügen würden.

Die Verlaufsdaten könnten außerdem genutzt werden, um einige Statistiken anzuzeigen, wie

  • Wie oft läuft jeder Indexer?
  • Wie ändern sich die Laufzeiten über die Zeit?
  • Mit zusätzlich gespeicherten Metadaten: Wie korrelieren Laufzeiten mit der Anzahl an Produkten, Anzahl an Kategorien, etc.

Beiträge via Pull Request sind herzlich willkommen. Wer interessiert daran ist, Haupt-Mitwirkender zu werden, kann sich auch gerne bei mir melden.

Fabian Schmengler

Author: Fabian Schmengler

Fabian Schmengler ist Diplom-Informatiker und Magento Entwickler bei integer_net. Seine Schwerpunkte sind Backend-Entwicklung, Konzeptionierung und Test-Automatisierung. Seit 2011 ist er Magento Certified Developer, seit 2014 Magento Certified Solution Specialist.