Rolf B: PHP-Router mit Attributen: Automatisches Registrieren und Cachen von Controller-Klassen

Beitrag lesen

Hallo TS,

das Problem bei eval() dürfte auch sein, dass der opcache dafür nicht greift.

Bei den Filesystemen bin ich zuversichtlich, dass sie performant sind, wenn Du eine konkrete Datei suchst.

Das sequenzielle Durchsuchen eines Ordners ist eine andere Sache. Aber mehr als 100 Controller wirst Du nicht haben. Selbst wenn es 200 oder 300 sind. Hier kann es helfen, eine Ordnerstruktur zu schaffen, die nur auf unterster Ebene Dateien enthält. Dadurch sind die Knoten auf höhererer Ebene nicht zu groß und lassen sich schnell einlesen. Das Suchen der Class-Datei in einem Order erfolgt mit file_exists, und das sollte - außer bei FAT-Systemen - immer schnell sein.

Eine Verteilung von Controllern via Anfangsbuchstabe ist jedenfalls nichts, womit man ein Projekt organisieren sollte. Da gefällt mir die Idee mit Ordnern in der URL doch besser. Will man keine Schreibweisenkonvention, kann man auch hergehen und die URL in Pfadsegmente zerlegen. Segment für Segment schaut man im Code-Order

  • gibt es einen gleichnamigen Ordner für das Segment? -> Ok, Segment steht für einen Ordner, suche in diesem Ordner weiter.
  • gibt es im Pfad eine Datei "$segmentController.php" -> Ok, Segment bezeichnet einen Controller

Die Namenskonvention "xyzController.php" stellt sicher, dass auf diese Weise nur Controller angesprochen werden können. Es mag auch interne (Sub-)Controller geben, die nicht direkt von außen angesprochen werden sollen. Diese kann man z.B. xyzSubCtrl.php nennen (NICHT SubController).

Bevor man solche Dinge angeht, sollte man aber erstmal ein paar Performance-Messungen des verwendeten Dateisystems machen. Ein RASPI, ein Windows-PC und ein Shared Hosting Server könnten sich - vor allem unter Last - sehr unterschiedlich verhalten.

Die aus meiner Sicht sicherste Lösung ist aber ein Controller-Repository, das durch ein Tool gepflegt wird und sich aus dem Quellcode ableitet. Ab PHP 8 bieten sich hier auch Attribute an, die ein Tool finden und auswerten kann. Das Controller-Repository kann man in eine Datenbank legen (DB-Zugriffe wird man eh brauchen) oder in einer Textdatei speichern. Auf diese Weise wird zuverlässig verhindert, dass eine gefälschte URL Code lädt, der eigentlich gar nicht als Controller geladen werden soll. Und man hat, nachdem im Repository die richtige Zeile gefunden ist, sofort den korrekten Pfad zur Source-Datei.

Ein Projekt, das so groß ist, dass man solche Performance-Klimmzüge machen muss, sollte sich aber auch fragen, ob PHP das richtige Werkzeug dafür ist.

Rolf

--
sumpsi - posui - obstruxi