Hallo zusammen,
ich hatte genau das gleiche Problem und möchte hier kurz dokumentieren, was die eigentliche Ursache war und wie man es auf Anwendungsebene beheben kann - vielleicht hilft es dem nächsten, der nach "Undefined offset XmlFileLoader.php line 582" sucht.
Was passiert ist: Nach dem Upgrade auf Ubuntu 24.04 ging ein PrestaShop 1.7.6.2 Shop von jetzt auf gleich nicht mehr. Im Error-Log tauchten massenhaft PHP Notice: Undefined offset in XmlFileLoader.php on line 582 auf - tausende pro Sekunde, die Logdatei wuchs in Minuten auf mehrere GB.
Die Ursache: Ubuntu 24.04 bringt eine neuere Version von libxml2 mit. Diese verarbeitet Whitespace im xsi:schemaLocation-Attribut von XML-Dateien anders als die Vorgängerversion. In Symfony 3.4 (auf dem PrestaShop 1.7.x aufbaut) gibt es in der Methode validateSchema() einen preg_split('/\s+/', $element), der die Namespace-URL-Paare aus dem Attribut liest. Die neue libxml2 liefert führende/nachfolgende Whitespace-Zeichen mit, wodurch leere Elemente im Array entstehen. Die Schleife erwartet aber immer Paare - und greift dann auf nicht existierende Array-Indizes zu. Ein einzelner Notice, der sich in einer Endlosschleife wiederholt und die Platte vollschreibt.
Fix - zwei Änderungen in einer Datei:
vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
1. In der Methode validateSchema() als erste Zeile return true; einfügen — das überspringt die XSD-Validierung komplett:
Code: Select all
public function validateSchema(\DOMDocument $dom)
{
return true;
// ... rest der Methode
}
Die XSD-Validierung prüft nur, ob die XML-Dateien dem Schema entsprechen. Sie hat keinen Einfluss auf die Funktionalität. Die Dateien im vendor-Verzeichnis sind korrekt ausgeliefert.
2. Zusätzlich (als Absicherung, falls jemand den return-Workaround später entfernt) die preg_split-Zeile absichern. Vorher:
Code: Select all
$items = preg_split('/\s+/', $element);
Nachher:
Code: Select all
$items = preg_split('/\s+/', trim($element), -1, PREG_SPLIT_NO_EMPTY);
Danach Cache leeren und ggf. OPcache zurücksetzen.
Wichtig: Beide Änderungen liegen im vendor/-Verzeichnis und werden bei einem composer update überschrieben. Die eigentliche Lösung ist ein Upgrade auf eine aktuelle PrestaShop-Version mit aktuellem Symfony und PHP 8.x. PrestaShop 1.7.6 ist seit Jahren EOL und bekommt keine Sicherheitsupdates mehr.
Vielleicht erspart das jemandem ein paar Stunden Fehlersuche.
