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

Beitrag lesen

Hallo borisbaer,

Es könnten schon so um die 30 ControllerKlassen werden. Inwiefern wird die Instanziierung dadurch erschwert?

Das ist gar nichts.

Diese Unterseiten haben jeweils eigene Controller und die stecke ich auch zusammen in ein entsprechendes Unterverzeichnis

Jetzt sag nicht, du programmierst für jedes Spiel eigene Controller?!

Dieses Autoload habe ja installiert, aber inwiefern kann ich das verwenden, um nicht cachen zu müssen.

Der Autoloader muss doch zur Klasse XyzController die richtige Quellcode-Datei finden. Dazu musst Du per require die richtige PHP Datei laden. Wenn Du nun ein Array hast, wo drinsteht, dass SignInController in /controllers/user/SignInController.php) zu finden ist, dann kann der Autoloader das verwenden, wenn er aufgefordet wird, die Klasse SignInController zu beschaffen.

Die Herausforderung ist, dieses Array zur Laufzeit performant zu beschaffen. Ein Caching während eines einzigen PHP Requests ist sinnlos, weil PHP ja eine Klasse nur einmal lädt, danach ist sie im Speicher und der Autoloader wird nicht noch einmal danach gefragt. Du brauchst also für diesen Klassen-Index eine Speicherungsform, die einen einzelnen PHP Request überlebt, und am besten auch nicht Userbezogen ist (damit meine ich: $_SESSION wäre ein schlechter Platz dafür).

In ASP.NET gibt's außer dem Session-Speicher auch einen Application-Speicher, aber nicht in PHP. Deshalb mein Vorschlag mit einer Textdatei, oder mit einer PHP-Datei, die dieses Index-Array erzeugt und die Du mit require_once einmal dazu holst. Eine solche Datei sollte aber nicht im laufenden Webrequest-Betrieb verändert werden, das stört den OpCache und es kann auch zu konkurrierenden Zugriffen kommen. Deshalb mein Vorschlag, sie über ein Tool vorab zu generieren und zusammen mit der Anwendung auf den Server zu laden.

dann kommen inkludierte Dateien bei PHP sowieso automatisch in einen Cache?

Jein. Das hängt an der PHP Version und an der Serverkonfiguration. Guck in die php.ini des Servers, oder lass auf dem Server ein Miniscript laufen, in dem nur phpInfo() aufgerufen wird. Und dann guck, was da bei den opcache-Einstellungen steht.

Wenn PHP eine Code-Datei lädt, interpretiert es nicht deinen Sourcecode. Statt dessen compiliert es ihn in einen Zwischencode, den Bytecode, und der wird dann von der ZEND-Engine interpretiert. Der OpCache speichert den generierten Bytecode und prüft bei jedem Zugriff, ob sich die Quellcodedatei verändert hat.

Neuere PHP Versionen gehen noch einen Schritt weiter, so wie auch neuere JavaScript Engines, und compilieren den Bytecode zu echtem Maschinencode (Just In Time Compiler - JIT). Auch das kann man ein/ausschalten, auch darüber gibt Dir phpInfo() Auskunft. Ein JIT bringt aber nur dann richtig was, wenn man CPU-intensive Dinge tut. Für normales "Datenschaufeln" ist der Bytecode kaum langsamer.

Was ist die Alternative? „Schreibe dir ein Utility-Script“ hast du oben geschrieben. Meinst du damit eine Art Helfer-Funktion?

Ich meine eine eigene PHP Datei, die Du entweder über deinen lokalen Webserver oder gleich von der Kommandozeile aus laufen lässt, und die die Index-Datei erzeugt. Diese PHP Datei kommt nicht auf den öffentlichen Webserver, die bleibt auf deiner Entwicklungsmaschine. Aufgaben: Controller zusammensuchen, Index aufbauen und in eine Datei schreiben. Das ist dann eher klassische Dateiverarbeitung und keine Verarbeitung eines Webrequests. PHP ist dafür nicht optimiert, kann es aber auch.

Okay, das muss gar nicht PHP sein. Wenn Du lieber ein Bash-Script oder ein Programm in Java oder Python dafür schreibst - geht genauso.

Rolf

--
sumpsi - posui - obstruxi