redaxo/redaxo — pull request #164 by gharlan (2012-11-21 23:28:07+00:00)
Title: rex_autoload in Kombination mit anderen Autoloadern

@staabm Du hattest im sfFinder-Branch es mal so geändert, dass das vendor-Verzeichnis im core nicht mehr von unserem Autoloader erfasst wird und stattdessen den Composer-Autoloader zusätzlich eingebunden. Da wir den Branch nicht übernommen haben, ist das im master nicht so. Ich habe jetzt aber auch bemerkt, dass das problematisch wäre. PHPUnit im tests-Addon zum Beispiel nutzt aber schon einen eigenen Autoloader, da haben wir somit auch die Problematik, daher dieses Issue..

Zunächst noch mal der aktuelle Ablauf unseres Autoloaders:

* Wird ein noch unbekannter Ordner erstmalig hinzugefügt, werden alle Dateien darin ausgelesen und nach Klassen durchsucht. Die neuen Zuordnungen Klasse=>Datei werden dem Cache hinzugefügt.
* Wird eine Klasse nicht gefunden, werden pro Request einmalig alle Ordner neu durchsucht (also alle Dateien per Tokenizer analysiert), um eventuelle Verschiebungen oder neue Klassen zu finden.

Der zweite Punkt greift somit im Normalfall nur während der Entwicklungsphase (beim Verschieben oder Hinzufügen von Klassen). Gibt es aber nun Klassen, die über andere Autoloader eingebunden werden, wird bei jedem Request, bei dem die Klasse verwendet wird, zunächst unser Autoloader die Klasse nicht finden, und daher alle Dateien neu analysieren. Danach erst wird dann der andere Autoloader an die Reihe kommen. Das ist natürlich sehr ineffizient (so eine komplette Analyse dauert bei mir etwa 0,8s bis 1,0s)..

Mein Vorschlag ist daher, doch alle vendor-Verzeichnisse automatisch unserem Autoloader hinzuzufügen, und die anderen Autoloader nicht einzubinden (werden sie zusätzlich eingebunden, schade sie aber auch nicht, sind nur überflüssig). Ich sehe da auch keine wirklichen Nachteile, denn unser Autoloader kommt ja mit jeder Struktur klar und bei ganz normalen Seitenaufrufen ist er auch sehr effizient, da er für jede Klasse den genauen Pfad gecacht hat. Die zusätzlichen Arbeiten, wie Ordner auslesen und Dateien analysieren passieren ja immer nur einmalig beim Hinzufügen von neuen Ordnern (und dann auch nur der eine Ordner). Und nach dem Cache löschen, Verschieben von Klassen oder Hinzufügen neuer Klassen innerhalb eines eigentlich bekannten Ordners ist halt eine komplette neue Analyse notwendig.

@staabm Was meinst du dazu?