v2.0.x Komplizierter "AdminMenuSource"-Caching-Bug

Thema wurde von Avenger, 5. Juni 2013 erstellt.

  1. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Bin auf ein ziemliches Problem bei der Überladung von "AdminMenuSource" gestoßen...

    Wenn man diese Klasse überlädt mit z.B.

    PHP:
    class pt_AdminMenuSource extends pt_AdminMenuSource_parent
    dann meldet das System beim erneuten Aufruf, dass "pt_AdminMenuSource_parent" nicht definiert ist.

    Ursache ist das Überladen, in Verbindung mit dem Caching...

    Durch das Überladen entsteht ja das Objekt "pt_AdminMenuSource", dass dann serialisiert und gecached wird...

    Wenn der Cache beim nächsten Durchlauf nun wieder geladen wird, dann wird der Cacheinhalt de-serialisiert (mit "unserialze"), und bei diesem Prozess wird versucht, das Objekt "pt_AdminMenuSource" zu instantiieren.

    Wobei dann die (richtige) Meldung, dass "pt_AdminMenuSource_parent" nicht definiert ist, erscheint.

    Denn "pt_AdminMenuSource_parent" wird ja erst bei der Instantiierung von "AdminMenuSource" erzeugt.

    Im Moment fiel mir da nur ein ganz brutale Lösung ein:

    PHP:
    $t_data_serialized=str_replace('O:18:"pt_AdminMenuSource"','O:15:"AdminMenuSource"',$t_data_serialized);
    D.h, in den serialisierten Cache-Daten wird das Objekt 'O:18:"pt_AdminMenuSource"' ersetzt mit 'O:15:"AdminMenuSource"', so dass beim de-serialisieren des Cache das "AdminMenuSource"-Objekt erstellt wird, und so alles wieder seinen richtigen Gang geht...
     
  2. Nonito (Gambio)

    Nonito (Gambio) Administrator

    Registriert seit:
    21. April 2011
    Beiträge:
    279
    Danke erhalten:
    134
    Danke vergeben:
    52
    Hallo Avenger,
    das stimmt. Das Problem ist jetzt schon öfter aufgefallen. Unschön ist, dass das ganze Objekt gecached wird. Schöner wäre, wenn nur das Ergebnis der Methoden gecached werden würde. Wir ordnen gerade eh die Klassen im Adminbereich um und passen die Stelle dann auch gleich mit an.