OPCache und php8 - Cache Error 500

Hallo zusammen,

nach der Umstellung auf php8 bekomme ich unter Einstellungen > Cache/Performance im Fenster bei Klick auf den Reiter „Cache“ nichts mehr angezeigt, es kommt ein Fehler-Fenster ohne Inhaltstext mit der Titelzeile "500 - "

Wie ich aus diesem Beitag https://forum.shopware.com/t/shopware-5-7-und-php-8/88900 entnehme, liegt es am OPCache.

Ich habe diesen in meinem Hosting deaktiviert, der Fehler verschwindet und das Cache-Fenster zeigt wieder informationen an. Nun würde ich aber gerne aus Performance-Gründen den OPCache reaktiveren.

Im Thema heißt es dann, Zitat: „die Funktion opcache_get_status ist da standardmässig aus Sicherheitsgründen deaktiviert, da andernfalls im Shared Hosting der OPCache von anderen Kunden ausgelesen werden könnte.“ sowie „sieht so aus, als ob du die OPcache PHP Extension nicht korrekt installiert/konfiguriert hast für die PHP Version, die du gerade im Einsatz hast. Hier wird geschaut, ob die Extension aktiv, aber danach wir die Function nicht gefunden. Da solltest du mal mit deinem Hoster sprechen.“

Das habe ich getan, dieser sagt mir, das ich in meinem Paket nichts ändern kann in Bezug auf den OPCache-Status.

Nun tritt der Fehler ja erst seit php8 auf. Unter php 7.4 mit aktivem OPCache gibts den Fehler nicht.

Wer kann mir sagen, ob ich in Shopware etwas umstellen oder etwas in einer Datei ändern kann, das er trotz OPCache (der ebenso konfiguriert ist wie in 7.4) keinen Fehler mehr ausgibt und mir den Inhalt vom Cache-Fenster wieder anzeigt?

Hier solltest du fündig werden:

Bedeutet das, wenn man nur Shared Hosting verwendet, kann man den Fehler nicht beheben? Oder gibt es eine Möglichkeit, dem Shop das irgendwie „vorzutäuschen“ damit er den Inhalt vom Cache-Fenster anzeigt?

Hallo,

das kannst Du im Shared Hosting nur beheben, wenn Du die Abfrage änderst so wie in dem anderen Posting beschrieben.

Es handelt sich bei diesem Fenster jedoch nur um eine „Übersicht“ - der OPCache funktioniert trotzdem (Du siehst halt nur den Status nicht …)

Viele Grüße

Einen kleinen Bug bringt das scheinbar noch mit sich - klicke ich im Cache-Fenster unten unter „Welche Bereiche sollen geleert werden?“ alles an, und dann auf „Leeren“ - so kam sonst das Fenster „Theme Kompilierung“ - das erscheint jetzt nicht mehr. Die Themes muss ich dann also separat kompilieren, wenn ich den Button klicke?

Ich müsste meinen Hoster also bitten, den „opcache_get_status“ zu aktivieren?

(Der wechsel vom Shared Hosting zum Server steht zwar an, wird aber vermutlich erst mit dem Wechsel auf Shopware 6 erfolgen - und das wird noch ein wenig dauern.)

Wenn Dein Hoster vernünftig ist und Sicherheit ernst nimmt, wird er das im Shared Hosting nicht für Dich freischalten.

Das Theme kannst Du auch unter Einstellungen → Themes neu kompilieren im Cache Manager.

Danke dir - der Hoster nimmt es ernst, sie schalten es nicht für mich frei (hatte ich aber auch nicht mehr erwartet nach dem lesen der Infos vom Thread).

Gäbe es eine Möglichkeit, was bei Drupal im Link disktuiert wird, selbst umzusetzen? Oder ist das eine Core-Sache, welche nur Shopware selbst machen kann?

Ich habe mir das im Detail nicht angesehen, aber @SmartStylez hat es wohl basierend auf den Drupal Link erfolgreich umgesetzt.

@SmartStylez: Würdest du die Info teilen, wie du das umgesetzt hast?

@Michael_Telgmann: Gibt es Hoffnung, das ihr diesen Bug in Shopware 5 noch behebt, damit es wirklich für alle mit php8 ohne Einschränkungen kompatibel ist? Es scheint ja einige zu geben, die dieses Problem in Verbindung mit Shared Hosting haben.

Hallo @Andreas_147

gerne ein Ticket aufmachen mit genauer Beschreibung, wie der Fehler nachzustellen ist. Ich kann so erstmal nicht nachstellen.

Viele Grüße aus Schöppingen
Michael Telgmann

@Michael_Telgmann: Ich habe soeben ein Ticket im Issuetracker erstellt und den Fehler beschrieben sowie zwei Screenshots angefügt (Fehlerbeschreibung bzw. die Art, wie ich das umgesetzt habe, ginge sicher professioneller - aber ich hoffe, das hilft euch trotzdem!)

Wer mag, kann bitte gerne auch noch dafür Voten:
Ticket OPCache/php8/Shared-Hosting

1 „Gefällt mir“

Klar, ich werde die Lösung spätestens am Wochenende zur Verfügung stellen, bin nur gerade unterwegs und nicht am Rechner.

Anbei die Lösung (getestet mit Shopware 5.7.17 und PHP 8.2.4):

Öffne die Datei /engine/Shopware/Components/CacheManager.php

Suche die Stelle:

if (\extension_loaded(‚Zend OPcache‘) && \ini_get(‚opcache.enable‘)) {
$status = opcache_get_status(false);
$info[‚files‘] = $status[‚opcache_statistics‘][‚num_cached_scripts‘];
$info[‚size‘] = $this->encodeSize($status[‚memory_usage‘][‚used_memory‘]);
$info[‚freeSpace‘] = $this->encodeSize($status[‚memory_usage‘][‚free_memory‘]);
} else {

und ersetze sie durch:

if (function_exists(‚opcache_invalidate‘)) {} else {

1 „Gefällt mir“

Vielen Dank fürs Teilen deiner Lösung!!

Sehr gerne. Hat es denn geklappt? Ich habe die Lösung auch deinem Ticket im Issuetracker hinzugefügt, damit es in ein zukünftiges Release mit einfließen kann.

Sorry, ich konnte es leider erst jetzt testen. Erst hat es nicht funktioniert, dann habe ich es aber hinbekommen. Danke, das du den Issuetracker erweitert hast und danke @Michael_Telgmann das ihr das für Version 5.7.18 aufgenommen habt!

Damit es funktioniert habe ich den Code angepasst (es waren nur Zeichen zu ändern, lag vermutlich am einkopieren hier im Forum):

if (\function_exists('opcache_invalidate')) {} else {

Ich habe das \ vor „function_exists“ ergänzen sowie ‚ und ‘ bei „opcache_invalidate“ gegen ' ersetzt - dann hat es funktioniert.

Was jetzt funktioniert - die Fehlermeldung ist verschwunden, der Inhalt im Bereich „Cache-Verzeichnis Informationen“ wird nun wieder angezeigt. Was aber immer noch nicht geht (das bringt uns vermutlich erst die Core-Anpassung in Shopware 5.7.18 wieder) ist, wenn man unter „Welche Bereiche sollen geleert werden“ die einzelnen Punkte anklickt und anschließend auf „Leeren“ klickt, so wird der Cache zwar geleert, aber das Fenster zum „Themes kompilieren“ erscheint weiterhin nicht mehr.

Seltsam, hab’s grad extra nochmal getestet. Auch das Kompilieren des Themes funktioniert bei uns problemlos.

Folgendes ist mir heute aufgefallen:

Wenn ich wieder die Ursprungs-Datei CacheManager.php ohne Änderungen einspiele, dann kommt die Fehlermeldung. Klicke ich bei „Welche Bereiche sollen geleert werden?“ alles an und dann auf „Leeren“ passiert nichts. Klicke ich nur die Punkte „Template-Cache“ und „Themes kompilieren“ an und dann auf „Leeren“ kommt das Fenster zum Themes-Kompilieren zusammen mit der Fehlermeldung „500 -“ ohne Inhalt.

Passe ich die Datei wie von dir beschrieben wieder an, ähnliches verhalten - aber ohne die Fehlermeldung. Die ist dann weg und auch der Bereich „Cache-Verzeichnis Informationen“ zeigt wieder etwas an (so wie gewünscht).

Klicke ich dann wieder alle Punkte unten an und gehe auf „Leeren“, dann kommt kurz das Fensterchen „Cache wird geleert“ und sonst nichts weiter. Auch die Info oben rechts „Cache geleert“ erscheint nicht. Der Cache wird aber geleert, was man beim Klick auf „Neu laden“ an den Werten sieht. Außer vom Template/Theme, da ändert sich nichts am Wert.

Klicke ich dann nun auch hier wieder nur die zwei Punkte Template und Theme an, dann kommt das Theme-Kompilieren-Fenster (das funktioniert auch und läuft durch, der Wert beim Template-Cache ändert sich) und oben rechts auch die Info für „Cache geleert“ wird angezeigt.

Das Kompilieren der Themes funktioniert daher auch bei mir, aber nur, wenn ich nur die zwei genannten Punkte anklicke. Das Verhalten besteht aber auch mit der ungeänderten CacheManager.php und erst seit php8, denn mit 7.4 war das noch nicht so.

Bei mir klappt es aber tatsächlich auch, wenn ich alle Punkte angeklickt habe. Nutzt du denn das Standard-Theme?

Seltsame Sache. Ich nutze ein eigenes Theme als Ableitung vom Standard-Theme (wie im Tutorial beschrieben) mit ein paar Farbänderungen (Header, Footer und z.B. ausgeblentem Gutschein-Feld im Warenkorb). Mehr eigentlich nicht. Ich habe es in zwei verschiedenen Shops gestetet (5.7.15 und 5.7.17) - bei beiden geht es nicht, solange ich alle Punkte anklicke - aber erst seit der Umstellung von php 7.4 auf 8.