Weiße Seite

Beschreibung: Keine Ausgabe, es wird nur ein leeres (komplett weißes) Fenster im Browser angezeigt

Kategorie: Fehlermeldungen

Link zu diesem Artikel: Alles auswählen

[url=https://www.phpbb.de/kb/viewarticle?a=109&sid=fb46781ba89282e20ec7ae148528af49]Knowledge Base - Weiße Seite[/url]

Weißer Bildschirm

Das Forum gestartet, und alles, was angezeigt wird, ist ein weißer Bildschirm! Nicht gerade das erwartete Ergebnis, offensichtlich gibt es einen Fehler, aber welchen und wo?
Diese Fragen zu beantworten ist nicht ganz einfach, weil ja zunächst nichts angezeigt wird, noch nicht mal eine Fehlermeldung. Warum aber ist das so? Ein weißer Bildschirm bedeutet zunächst, dass ein PHP Skript irgendwohin verzweigt hat, wo keine Ausgabe mehr erfolgt oder eine solche nicht mehr erfolgen kann, es hat sich quasi "aufgehängt".

Der erste Hinweis, wo man suchen muss, ergibt sich meist schon aus den Handlungen kurz zuvor. Wurde eine Erweiterung (Extension) installiert? Oder ein Update oder Upgrade auf eine andere phpBB Version durchgeführt? Oder hat man selbst gar keine Änderungen durchgeführt?
Grundsätzlich gilt, dass eine funktionierende Software nicht plötzlich selbständig entscheidet, nicht mehr so zu funktionieren, wie ihr Programmierer das vorgesehen hat. Gehen wir also die obigen Fälle nacheinander durch.

Eigene Änderungen (Neue Erweiterung, Update/Upgrade von phpBB)
Ist nach einer Änderung im Frontend plötzlich alles weiß und es wird sonst nichts angezeigt, hilft es oft, diese Änderung wieder rückgängig zu machen. Das ist bei Erweiterungen deutlich einfacher als bei einem Update/Upgrade, denn wenn die zuletzt installierte Erweiterung im ACP wieder deaktiviert wurde, sollte das Forum wieder im ursprünglichen Zustand sein und wie gewohnt funktionieren. Bei einem Update/Upgrade muss das Backup der vorherigen Dateien und der gesicherten Datenbank wieder zurück gespeichert werden, was mit deutlich mehr Aufwand verbunden ist. Führt diese Vorgehensweise nicht zum Erfolg, hilft nur noch die Fehlersuche mit den Tipps für Fortgeschrittene.

Keine eigenen Änderungen
Jetzt wird es schon etwas schwieriger, und außerdem müssen wir jetzt anfangen zu prüfen, was für eine Server-Lösung genutzt wird. Grob gesagt gibt es zwei Möglichkeiten: Es wird ein Dedicated Server verwendet, bei dem man selbst Root-Berechtigungen besitzt und die verwendete Software und deren Einstellungen selbst pflegt. Oder all das macht der Provider für einen und man kümmert sich nur noch um die Software (Hosted oder Virtual Server), die darauf läuft. Hat man Root-Berechtigungen, ist ja bekannt, welche Änderungen dort eventuell durchgeführt wurden, deshalb lassen wir diesen Fall beiseite. Im zweiten Fall kann es passieren, dass der Provider beispielsweise eine neue PHP-Version oder eine neue Version der Datenbank-Software installiert. Davon kann man betroffen sein, wenn die PHP-Version sich nicht mehr mit der genutzten Version der Foren-Software verträgt. Damit stellt sich die Frage, wie man z.B. die verwendete PHP-Version feststellt, um dann zu prüfen, ob die installierte phpBB-Version sich damit verträgt. Wenn das Backend, also das ACP noch erreichbar ist (z.B. über mein-forum/adm, kann man dort über den Link "PHP-Info" viele Informationen über die Serverkonfiguration erfahren, z.B. die verwendete PHP-Version. Kommt man nicht mehr ins Backend, kommt man ohne eine Nachfrage beim Hoster nicht weiter. Also Kontakt aufnehmen und fragen.

Tipps für Fortgeschrittene
Jetzt sind wir an einem Punkt angelangt, an dem zur Fehlersuche etwas tiefer eingestiegen werden muss. Da der weiße Bildschirm keine Fehlermeldung(en) ausgibt, müssen wir woanders danach suchen. Zunächst sehen wir nach, ob PHP etwas in die Log-Datei geschrieben hat, in der Fehler durch PHP abgelegt werden. Wo finden wir die? Hier ist wieder zu unterscheiden zwischen den verschiedenen Server-Lösungen.

Dedicated Server:
Mit vollem Root-Zugriff ist das Problem schnell gelöst, als Administrator ist ja bekannt, wo was installiert und wie konfiguriert wurde. In der Regel findet man das Fehler-Log von PHP dort, wo PHP installiert wurde, bei einem Linux-System also unter /etc/php/logs (die Bezeichnung des PHP-Verzeichnisses kann natürlich individuell verschieden sein, z.B. php74). In diesem Unterverzeichnis sollte sich eine Datei mit dem Namen php_error.log befinden (der Name kann je nach Einstellung abweichen, Einstellung s. Eintrag für error_log in der Datei php.ini). In einem Windows-Server sollte XAMPP installiert sein, dort findet sich die entsprechende Datei unter /xampp\php\logs. Da die Einträge in dieser Datei zeitlich geordnet sind, ist die Eingrenzung einfach, wenn die Zeit, zu der der Fehler aufgetreten ist, bekannt ist. Dazu später mehr, zunächst ist die Datei, in der etwas zum Fehler stehen kann, bekannt.

Hosted oder Virtueller Server:
Bei einem Server, dessen grundlegende Software durch den Anbieter installiert und gepflegt wird, wird es komplizierter, weil die Anbieter im Regelfall keinen Zugriff auf die Fehler-Logs gewähren. Man kommt also ohne eine entsprechende Rückfrage beim Anbieter zunächst nicht weiter, um die entsprechenden Auszüge aus dem Fehler-Log zu erhalten, sollte man den Zeitraum, in dem der Fehler aufgetreten ist, parat haben und angeben können.

Fehler-Log lesen:
Nachdem die Datei mit den Fehlerdaten gefunden und geöffnet wurde, wollen wir uns ansehen, was dort festgehalten wird, dazu dient nachstehende Beispieldatei mit drei Einträgen. Diese Einträge sind zugegebermaßen ziemlich lang, enthalten dafür aber alle Informationen zur Identifizierung und Lokalisierung des aufgetretenen Fehlers:

Code: Alles auswählen

[Sat Jan 18 23:30:35.888819 2020] [php7:error] [pid 8424:tid 1860] [client ::1:57570] PHP Fatal error:  Uncaught TypeError: Argument 5 passed to phpbbde\\movemessage\\event\\main_listener::__construct() must be an instance of phpbb\\language\\language, instance of phpbb\\user given, called in www.mein-forum.de\\cache\\production\\container_4335734bbdd20f586549a504dff5f80c.php on line 2777 and defined in www.mein-forum.de\\ext\\phpbbde\\movemessage\\event\\main_listener.php:79\nStack trace:\n#0 www.mein-forum.de\\cache\\production\\container_4335734bbdd20f586549a504dff5f80c.php(2777): phpbbde\\movemessage\\event\\main_listener->__construct(Object(phpbb\\auth\\auth), Object(phpbb\\content_visibility), Object(phpbb\\db\\driver\\factory), Object(phpbb\\template\\twig\\twig), Object(phpbb\\user), './', 'php')\n#1 www.mein-forum.de\\vendor\\symfony\\dependency-injection\\Container.php(295): phpbb_cache_container->getPhpbbde_Movemessage_ListenerService()\n#2 www.mein-forum.de\\vendor\\symfony\\dependency-injection\\ContainerBuilder.php(446): Symfony\\Component\\DependencyInjection\\Container->get('phpbbde.movemes...', 2)\n#3 H:\\xampp in www.mein-forum.de\\ext\\phpbbde\\movemessage\\event\\main_listener.php on line 79, referer: http://www.mein-forum.de/posting.php?mode=post&f=2

[Sat Jan 18 23:31:16.799119 2020] [php7:error] [pid 8424:tid 1860] [client ::1:57574] PHP Fatal error:  Uncaught TypeError: Argument 5 passed to phpbbde\\movemessage\\event\\main_listener::__construct() must be an instance of phpbb\\language\\language, instance of phpbb\\user given, called in www.mein-forum.de\\cache\\production\\container_4335734bbdd20f586549a504dff5f80c.php on line 2777 and defined in www.mein-forum.de\\ext\\phpbbde\\movemessage\\event\\main_listener.php:79\nStack trace:\n#0 www.mein-forum.de\\cache\\production\\container_4335734bbdd20f586549a504dff5f80c.php(2777): phpbbde\\movemessage\\event\\main_listener->__construct(Object(phpbb\\auth\\auth), Object(phpbb\\content_visibility), Object(phpbb\\db\\driver\\factory), Object(phpbb\\template\\twig\\twig), Object(phpbb\\user), './', 'php')\n#1 www.mein-forum.de\\vendor\\symfony\\dependency-injection\\Container.php(295): phpbb_cache_container->getPhpbbde_Movemessage_ListenerService()\n#2 www.mein-forum.de\\vendor\\symfony\\dependency-injection\\ContainerBuilder.php(446): Symfony\\Component\\DependencyInjection\\Container->get('phpbbde.movemes...', 2)\n#3 H:\\xampp in www.mein-forum.de\\ext\\phpbbde\\movemessage\\event\\main_listener.php on line 79, referer: http://www.mein-forum.de/posting.php?mode=post&f=2

[Tue Feb 25 18:27:25.643108 2020] [php7:error] [pid 4448:tid 1864] [client ::1:59491] PHP Fatal error:  Uncaught InvalidArgumentException: The routing file "www.mein-forum.de\\ext/crizzo/aboutus/config/routing.yml" contains unsupported keys for "crizzo_aboutus": "pattern". Expected one of: "resource", "type", "prefix", "path", "host", "schemes", "methods", "defaults", "requirements", "options", "condition", "controller". in www.mein-forum.de\\vendor\\symfony\\routing\\Loader\\YamlFileLoader.php:206\nStack trace:\n#0 www.mein-forum.de\\vendor\\symfony\\routing\\Loader\\YamlFileLoader.php(88): Symfony\\Component\\Routing\\Loader\\YamlFileLoader->validate(Array, 'crizzo_aboutus')\n#1 www.mein-forum.de\\vendor\\symfony\\config\\Loader\\DelegatingLoader.php(40): Symfony\\Component\\Routing\\Loader\\YamlFileLoader->load('ext/crizzo/abou...', 'yaml')\n#2 www.mein-forum.de\\phpbb\\routing\\router.php(116): Symfony\\Component\\Config\\Loader\\DelegatingLoader->load('ext/crizzo/abou...', 'yaml')\n#3 www.mein-forum.dehpbb\\routing\\router.php(261): phpbb\\routing\\router->get_routes()\n#4 in www.mein-forum.de\\vendor\\symfony\\routing\\Loader\\YamlFileLoader.php on line 206, referer: http://www.mein-forum.de/adm/index.php?i=acp_extensions&sid=ce78d470a982f01e37bd9085d9d14644&mode=main&action=details&versioncheck_force=1&ext_name=crizzo%2Faboutus
Jede Zeile beginnt mit einer Datum-Uhrzeit-Gruppe, die anzeigt, wann der Fehler aufgetreten ist. Nach weiteren drei Informationen, die hier nicht weiter von Interesse sind, wird der Fehlertyp und die Fehlerursache angezeigt; in allen drei Fällen dieses Beispiels handelt es sich um sog. "Fatal Error" von PHP, also einen Fehler, der zum Absturz führt und einen weißen Bildschirm zur Folge hat (engl. "fatal" = "tödlich").

Die Fehlerursache ist in den ersten beiden Beispielen identisch, wir wollen diese etwas genauer ansehen: "Uncaught TypeError" bedeutet zunächst, dass der Fehler nicht abgefangen wurde (oder nicht abgefangen werden konnte), also keine Routine existiert, die eine entsprechende Fehlermeldung ausgibt - aber das hatten wir ja bereits bemerkt. "TypeError" heißt, dass eine übergebene oder aufgerufene Variable nicht dem erwarteten Typ entspricht, der weitere Text der Fehlermeldung sagt auch genau, welches Argument betroffen und was passiert ist: Dem Konstruktor eines Event-Listeners wurde an fünfter Stelle der übergebenen Variablenliste statt des erwarteten Variablentyps phpbb/language/language eine Instanz von phpbb/user übergeben. Im weiteren Verlauf der Fehlermeldung wird auch verraten, wo das passiert ist: defined in www.mein-forum.de\\ext\\phpbbde\\movemessage\\event\\main_listener.php:79 sagt uns, dass in Zeile 79 des Skripts main_listener.php im Verzeichnis www.mein-forum.de\ext\phpbbde\movemessage\event statt des erwarteten Parameters $language ein Parameter $user übergeben wurde. Es handelt sich also um einen Programmierungsfehler im Konstruktor-Aufruf des Event-Listeners der Extension "movemessage". Ein Ersetzen der fehlerhaften Parameterübergabe mit der erwarteten Parameterübergabe sollte das Problem also lösen.

Das dritte Beispiel ist ebenfalls ein Fehler, der nicht abgefangen und mit einer Meldung ausgegeben wurde ("Uncaught"), diesmal handelt es sich aber um einen ungültigen Parameterwert ("InvalidArgumentException"), dessen Quelle auch sofort im Anschluss genannt wird: Die Routing-Datei der Extension crizzo/aboutus verwendet den Schlüssel "pattern", der aber nicht unterstützt wird, anschließend werden die unterstützten Werte aufgelistet. In diesem Fall wird die Zeilennummer in der betroffenen Datei ext/crizzo/aboutus/event/routing.yml zwar nicht explizit genannt, aber dafür gibt es ja die "Suche"-Funktion des Editors. Diese Fehlermeldung ist übrigens ein gutes Beispiel für einen Fehler, der beim Aktivieren einer Extension in einer phpBB-Version auftreten kann, für die diese Extension (noch) nicht angepasst wurde.