Wie eine Anfrage in PHP abläuft
Diese Seite richtet sich an PHP-Entwickler, die wissen möchten, was zwischen dem Moment passiert, in dem der Webserver eine Anfrage an PHP übergibt, und dem Moment, in dem die Seite PHP verlässt. Wenn Sie die Reihenfolge kennen, wissen Sie, wo Ihr Code läuft, was bereits eingerichtet ist, wenn er läuft, und in welche Ereignisse Sie sich einklinken können. Die folgenden Namen sind die echten Klassen und Methoden; öffnen Sie die Dateien neben dieser Seite.
Inhalt
- Die Kurzfassung
- index.php
- autoload.php
- ezpKernelWeb: Initialisierung
- Die Dispatch-Schleife
- Das Pagelayout und die Ausgabe
- Herunterfahren
- Ereignisse unterwegs
- Die Kommandozeile ist anders
Die Kurzfassung
index.php
-> autoload.php EXP_ROOT_DIR, phpcompat on PHP < 8.1, phar decision, class map autoloader
-> new ezpKernel( new ezpKernelWeb() )->run()
ezpKernelWeb::run()
requestInit() settings, siteaccess, session, request/preinput and request/input events
headers defaults plus security headers
dispatchLoop() URL alias translation, module and view lookup, policy checks, eZModule::run()
pagelayout eZTemplate with $module_result, unless the view switched it off
response/output filter the form token is added to POST forms here
shutdown()
-> echo $result->getContent()index.php
index.php (der Web-Front-Controller) tut selbst wenig:
- Setzt eine Standard-Zeitzone, wenn
php.inikeine hat,ignore_user_abort( true )underror_reporting( E_ALL ). - Beantwortet den Wartungsmodus aus
var/maintenance.json, bevor Einstellungen oder die Datenbank gelesen werden (expMaintenance::check()). - Bindet
autoload.phpein. - Führt eine Anfragefilter-Datei aus, wenn
config.phpEXP_REQUEST_PREPEND_FILEdefiniert. Sie läuft bei jeder Anfrage, auch in einem persistenten Worker, in demconfig.phpselbst nur einmal läuft. - Zeigt PHP-Fehler im Browser, wenn
eZINI::environment()devodertestist (ausEXP_ENVinconfig.env.php). - Führt den Kernel aus:
$kernel = new ezpKernel( new ezpKernelWeb() ); echo $kernel->run()->getContent();
autoload.php
Jeder Einstiegspunkt beginnt hier, im Web wie auf der Kommandozeile:
| Schritt | Warum er für Sie wichtig ist |
|---|---|
definiert EXP_ROOT_DIR | das Wurzelverzeichnis der Installation als absoluter Pfad; verwenden Sie es statt Pfaden, die aus __DIR__ einer Kernel-Datei berechnet werden, denn diese brechen, wenn der Kernel aus dem Engine-Archiv läuft (Das Engine-Archiv) |
lädt lib/phpcompat.php, wenn PHP_VERSION_ID < 80100 | Funktionen, die neuer als PHP 8.0 sind, gibt es auch unter 8.0 (Code schreiben, der unter PHP 8.0 läuft) |
liest EXP_ENGINE_PHAR | ob Kernel- und Bibliotheksklassen aus dist/engine.phar kommen |
hebt die Registrierung des Stream-Wrappers phar:// auf | sofern die Laufzeitumgebung nicht selbst darüber gelesen wird; ein Bild-Upload kann so niemals als phar eingebunden werden |
| registriert den Autoloader | autoload/ezp_kernel.php, var/autoload/ezp_extension.php und, mit EZP_AUTOLOAD_ALLOW_KERNEL_OVERRIDE, var/autoload/ezp_override.php (Autoloads und Klassen-Maps) |
ezpKernelWeb: Initialisierung
ezpKernelWeb (kernel/private/classes/ezpkernelweb.php) wird mit der Anfrage konstruiert und bereitet sie vor:
- liest
site.iniund ermittelt den Siteaccess (nach Host, Port oder URI), der die geltenden Einstellungen bestimmt; - startet die Sitzung (
sessionInit()) und die Anfrage (requestInit()), dierequest/preinputund dannrequest/inputmeldet (ezpEvent::getInstance()->notify( 'request/input', ... )); die Formular-Token-Prüfung vonezformtokenist ein Listener vonrequest/input; - sendet die Standard-Header (
Cache-Control,Content-Type,Content-language, die Sicherheits-Header vonezpKernelWeb::securityHeaders()), die sich je Pfad übereZHTTPHeaderüberschreiben lassen.
Ein POST ohne gültiges Formular-Token endet hier mit einer 403-Seite, bevor irgendein Modul läuft (CSRF-Schutz und ezformtoken).
Die Dispatch-Schleife
ezpKernelWeb::dispatchLoop() macht aus der Adresse ein Modulergebnis:
- URL-Übersetzung. Wenn der URL-Übersetzer aktiviert ist, macht
eZURLAliasML::translate()aus/about-uscontent/view/full/<node>, danach werden Platzhalter versucht (eZURLWildcard::translate()). - Modulsuche.
eZModule::accessAllowed()prüft die Modul- und View-Listen des Siteaccess,eZModule::exists()lädt diemodule.phpdes Moduls. - Zugriff. Der Benutzer braucht
user/loginfür den Siteaccess, danach prüfthasAccessToView()diefunctionsder View gegen die Richtlinien des Benutzers. Views in[RoleSettings] PolicyOmitList[]überspringen das. - Die View.
$module->run( $functionName, $params )führt die View-Datei übereZProcess::runFile()aus, das ihr$Params(mit$Params['Module']) übergibt und$Resultzurücknimmt. Eine klassenbasierte View gibt dasselbe Array zurück (Modul-Views als Klassen). - Weiterleitungen und Fehler. Eine View kann weiterleiten (
$Module->redirectTo()) oder einen Fehler zurückgeben ($Module->handleError( eZError::KERNEL_NOT_FOUND, 'kernel' )), was die Schleife noch einmal durch das Fehlermodul führt.
Das Pagelayout und die Ausgabe
Sofern die View es nicht ausgeschaltet hat ($Result['pagelayout'] = false; ein Template-Name dort wählt ein anderes
Pagelayout), erzeugt der Kernel eZTemplate::factory(), setzt $module_result (Ihr $Result mit content, path
und mehr) und rendert das pagelayout.tpl des Siteaccess
(View-Ergebnisse und das Pagelayout). Die Ausgabe
durchläuft dann den Filter response/output, in dem ezformtoken jedem method="post"-Formular das Token hinzufügt,
und wird zu einem ezpKernelResult.
Herunterfahren
shutdown() schließt die Zeile der Anfrage in den Anfrage-Logs ab (expRequestLog::finish()), führt die mit
eZExecution::addCleanupHandler() registrierten Aufräum-Handler aus (eZExecution::cleanup()), markiert das Ende als
sauber und speichert die Ablaufzeitstempel (eZExpiryHandler::shutdown()). Eine View, die ihre eigene Ausgabe sendet
(einen Download, JSON), endet vorzeitig mit eZExecution::cleanExit(); unter Velocity beendet dieser Aufruf die Anfrage
durch eine Exception, die der Server behandelt, also umschließen Sie ihn niemals mit catch ( Exception $e )
(Persistente Velocity-Worker für PHP-Entwickler).
Ereignisse unterwegs
| Ereignis | Art | Wann |
|---|---|---|
request/preinput | notify | bevor die Eingabe der Anfrage verarbeitet wird |
request/input | notify | die Anfrage ist bekannt; Eingabeprüfungen wie das Formular-Token |
module/functionlist | filter | die Liste der Views und Funktionen eines Moduls |
content/view | filter | die Knoten-ID einer Inhaltsansicht, bevor sie geladen wird |
response/preoutput, response/output | filter | die gerenderte Seite, bevor sie gesendet wird; geben Sie den Wert zurück |
Wie Sie zuhören: Ereignisse, Listener und Filter.
Die Kommandozeile ist anders
Kommandozeilenskripte führen ezpKernelWeb nicht aus. Sie beginnen mit autoload.php und dann eZScript: startup(),
getOptions(), initialize() (Siteaccess, Erweiterungen, Sitzung, Datenbank) und shutdown(). [Event] Listeners[]
werden nur an Webanfragen angehängt; [RunnableSettings] Listeners[] erreichen auch Befehle
(Einen Konsolenbefehl schreiben).
Verwandte Seiten
- Ein Rundgang durch den Quellbaum
- Das Muster Front-Controller
- Kernel-Architektur
- Freie Dokumentation: diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.