__PHP_Incomplete_Class_Name falsch
Sind wir zufällig einige sehr seltsame Fehler-logs. Sie passieren nicht auf jeder Seite ein Treffer, sogar mit dem gleichen Parameter/Aktionen/etc., und Sie scheinen nicht wiederholbar, jeder ist anders in seiner crash-Lage und Kontext. Aber fast alle haben falsch __PHP_Incomplete_Class_Name, als die Ursache.
Einem solchen Fehler ist:
main(): Das Skript versucht, zum ausführen einer Methode oder der Zugriff auf eine Eigenschaft eines unvollständigen Objekt. Bitte stellen Sie sicher, dass die definition der Klasse "LoginLogging" des Objekts, die Sie versuchen zu operieren geladen wurde vor unserialize() aufgerufen wird oder eine __autoload () - Funktion zum laden der Klassendefinition
Das problem ist, es gibt keine "LoginLogging" - Klasse. Das Objekt bezieht es sich auf das war der Typ ScormElement, wenn es gespeichert wurde, in die Sitzung.
Mache einen dump der variable gibt:
__PHP_Incomplete_Class::__set_state(array(
'__PHP_Incomplete_Class_Name' => 'LoginLogging',
'intUserId' => '64576',
'__intUserId' => '64576',
'intScormId' => '665',
'__intScormId' => '665',
'intScoId' => '9255',
'__intScoId' => '9255',
'strElement' => 'cmi.core.lesson_location',
'__strElement' => 'cmi.core.lesson_location',
'strValue' => '1',
'dttTimeModified' => QDateTime::__set_state(array(
'blnDateNull' => false,
'blnTimeNull' => false,
'strSerializedData' => '2011-08-31T08:05:22-0600',
'date' => '2011-08-31 08:05:22',
'timezone_type' => 1,
'timezone' => '-06:00',
)),
'__strVirtualAttributeArray' => array (),
'__blnRestored' => true,
'objUser' => NULL,
'objScorm' => NULL,
)
Alle Eigenschaften beibehalten werden, korrekt und entsprechen der definition der Klasse für ScormElement. Aber der name der Klasse ist falsch. Es ist keine Klasse mit dem Namen LoginLogging.
Woran liegt das und wie lösen wir es???
Bearbeiten: Dies ist nur ein Beispiel. Andere Fehler sind sehr ähnlich in der Struktur, aber auf andere Klasse-Typen und haben unterschiedliche unvollständige Namen. Jedoch, ALLE unvollständigen Namen haben die gleiche Zeichenfolge Länge der richtige Klassenname.
Bearbeiten 2011-10-27: ich bin immer noch zu sehen, diesen Fehler meldet, und haben keinen Erfolg gehabt bei der Suche nach einer Lösung. Jede Hilfe würde geschätzt werden.
PHP 5.3.3, APC, Standard-session-handler.
main()
Funktion aussieht? oder die Klasse, die aufgerufen wird, sieht wie?Sie scheinen sich auf 'LoginLogging' im code (zweite Zeile) - was ist das eigentlich? Ich vermute, dies ist die Ursache für den Fehler...
Wie bekommen Sie dieses Objekt? unserialize? Sitzung?
Die zweite Zeile ist nicht mein code. Das ist der dump der Variablen, die das problem verursacht.Mein code nicht enthalten "LoginLogging" als eigenständige Referenz. Es ist ein FM_LoginLogging Klasse und ein FmLoginlogging Klasse, aber nirgends haben wir einen "LoginLogging" Klasse / variable-name / Funktion / etc.
Es gibt keine Funktion namens main(). 😛 der definition Der Klasse für ScormElement ist Recht groß, aber man bekommt eine ziemlich gute Vorstellung von dem es auf der Basis der serialisierten version gezeigt.
InformationsquelleAutor VexedPanda | 2011-09-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geschrieben, in dem Zitat in deiner Frage
__PHP_Incomplete_Class_Name
ist ein Besondere Klassennamen in PHP, die verwendet wird, wenn die definition der Klasse konnte nicht gefunden werden, wenn Deserialisieren von (unserialize()
).Es ist vorgeschlagen, entweder sorgen die definition der Klasse verfügbar ist, oder einige autoloading für die fehlende Klasse.
Sie bemerkte, dass PHP-ist auf der Suche nach der falschen classname hier:
Es ist schwer zu sagen, mit der information, warum der Klassenname geändert wird bei der Serialisierung/unserialization. Die Informationen, die Sie gegeben haben (vor allem die dump), die in Ihrer Frage ist unvollständig.
Also die Optionen sind begrenzt auf einige Allgemeine Vorschläge:
Könnten Sie untersuchen die serialisierten string classname ist im es so könnte man zumindest sagen, wenn es passiert mit Serialisierung oder unserialization. Sie können leicht überprüfen serialisierten Daten mit dem Serialisierte PHP-Bibliothek die eine text-dumper-für debug-Zwecke.
Zusätzlich gibt es die
unserialize_callback_func
Ini-Richtlinie Sie verwenden können, um weitere, das problem aufzuspüren.Wie Sie schreiben, tritt das problem nicht mehr, ich vermute, dass irgendwann der Serialisierung auf Ihrer Website war gebrochen, die Speicherung, die ungültige Daten. Welches framework/libraries/Anwendung verwenden Sie? Die Komponente kümmert sich um die Serialisierung?
Was Sie tun können, um zu Debuggen, als Sie sagte, dass es die session-bezogenen: anmelden der callback, wenn es passiert (und die Klasse ist nicht per autoload) erhalten die session-ID, eine Kopie des binäre session-Daten (z.B. kopieren Sie die Datei in ein temp-dir von seinen eigenen), und Müllkippe-der stacktrace sowie globals weiter, um es in eine zweite Datei mit dem Suffix ".dump" oder so. Dann sind Sie in der Lage zu überprüfen, die serialisierte form der Sitzung sowie backtrace (nur, falls etwas genannt wurde, die bereits bis zu diesem Punkt) und globaler Variablen.
Ich kann zwar tun (und haben in der Vergangenheit, als der Fehler war frisch genug, dass die Sitzung noch auf Datei), schien es, dass der Inhalt der session-Datei war fehlerhaft (es hatte die falsche Klasse name). Das heißt, dass immer noch nicht lassen Sie mich mit nirgendwo zu gehen, und mit einer sample-Größe von ein ich bin nicht überzeugt, dass dies immer der Fall. Vorausgesetzt, es ist auf die Festplatte geschrieben falsch, was sind meine nächsten Schritte?
Ich bezweifle, dass eine Datei geschrieben, die falsch auf die Festplatte, dass nur diese bestimmten Klassennamen falsch. Wohl die Klasse lookup-Tabelle war out of sync. Es ist also nicht debuggt werden beim laden aber beim speichern würd ich sagen. An dem Punkt sind, wird die session gespeichert, in Ihrer Anwendung? Einige der Objekte darin haben, Ihre eigenen
Serializable
- Schnittstelle?Nein, das sind die standard-PHP-Klassen, und wir sind mit der Standard-PHP-session-handler, die die Serialisierung auf seine eigenen.
InformationsquelleAutor hakre
Wenn Ihr versucht, eine Eigenschaft zuzugreifen Methode, die ein Objekt oder serialisierte Wert, den Sie gespeichert haben in eine $_SESSION-variable und Sie enthalten die Klasse nach Aufruf von session_start() versuchen, einschließlich der Klasse vor Aufruf von session_start();
Mmmm, vielleicht könnten Sie besser dran, die Protokollierung durch einen bug-report mit PHP und sehen, ob Sie cant get eine Lösung, Weg.
Ohne reproduzierbare code, ich kann nicht melden Sie einen gültigen bug-report. 🙁
Warum nicht richten Sie ein paar tests dann auf der dev-server, das ist nicht schwer zu set-up "simuliert" Test -Iteration es und melden Sie es zur Datei-nichts ist unmöglich zu lösen. Sie müssen nur zu tun, etwas mehr Profilierung, bis Sie den Nagel, aber ohne dafür auch nur eine Zeile von deinem code irgendwie nur Spekulation, viel Glück!
Unser dev-server nicht zeigen diesen Fehler. (Oder Sie sind ungewöhnlich genug, um nie ausgelöst wird.)
InformationsquelleAutor gus
Dies geschieht, wenn wir versuchen zu initialisieren, die session vor dem laden der Klassendefinition für das Objekt, das wir versuchen, zu speichern in die session.
können Sie einfach json-Methoden in PHP
Funktionen json_encode array und wieder json_decode das array und speichern es in eine variable und als print-variable. Sie erhalten ein einfaches array.
zB.
funktioniert es sicherlich.
InformationsquelleAutor Shiv Aggarwal
Sind Sie, durch Zufall, mit einigen opcode-cache (z.B. APC, XCache) oder einem debugger? Sie verursachen manchmal seltsame Dinge passieren. Wenn es nicht ist und nie war ein LoginLogging Klasse in Ihrem Projekt, aber Sie ist nicht das einzige Projekt auf dem server, würde ich Gebot auf den cache.
Hmm, wir verwenden APC. Gibt es irgendwelche Lösungen? Es stellt eine bedeutende genug performance improvement (und in späteren Versionen von PHP), damit es zu deaktivieren ist nicht ideal.
InformationsquelleAutor a sad dude
Umfassen die Klasse vor dem session_start() funktioniert gut für mich. =)
InformationsquelleAutor Wellington Lorindo
Hakre Vorschlag zu betrachten session_write_close führte mich zu dem, was zu sein scheint eine zuverlässige Update:
Diese Kräfte die session geschrieben werden, bevor die Speicher-Bereinigung und-Klasse Entladung Auftritt. Dies ist wichtig, da eine änderung in PHP können dazu führen, dass eine race-condition zwischen APC entfernen von Referenzen und PHP schreiben Sie die session-Daten: http://news.php.net/php.internals/46999
InformationsquelleAutor VexedPanda
Wenn Sie versuchen, unserialize eine variable, muss php wissen, die Struktur des Objekts. Versuchen Sie, Ihre Klasse vor dem unserialize. Welche Klasse? die eine, die hält jene Eigenschaften angezeigt, die in Ihrem code. include('pathtoyourclass/classname.php') oder include_once('pathtoyourclass/classname.php').
Glück!
InformationsquelleAutor FerYepes
Es ist die Serialisierung Problem in Ihrem code.Es kann Ihren code aus irgendeinem Grund konnte nicht initialisiert das Objekt und im nächsten Teil von deinem code versucht zu konvertieren, das Objekt zu string oder einen anderen Datentyp.
Nur überprüfen Sie Ihren code, richtig initialisieren der Objekte.
Überprüfen, ob Sie mithilfe von serialize()/unserialize () - Methode.
InformationsquelleAutor Dev
Erhalten Sie das serialisierte Objekt aus einem service/stream oder aus einer Datei zu Lesen? Ich habe gesehen, es passieren in einem client-server-festlegen der client-side object und die server-seitige Objekte unterscheiden sich sehr wenig... vielleicht haben Sie eine Eigenschaft, die andere nicht haben. Dies geschieht auch, wenn Sie ein Objekt serialisieren, speichern Sie es als Datei, dann refactor-code entfernt eine Klasse und dann versuchen das Deserialisieren des Objekts.
Dann, wenn er deserialisiert und zu instanziieren versucht, die benötigten Klassen für Sie nicht existieren.
Der Fehler ist klar und einfach, Sie erstellen ein Objekt, für das die Klasse noch nicht geladen wurde.
Würd ich einen string Suche in Ihrem code finden, wo die benötigten Klasse liegt, und machen eine einfache autoloader (oder einfach nur eine raw-include/require) der Datei. Nur die Klasse muss es irgendwie geladen.
Wenn die Klasse nicht wirklich existiert überall, versuchen, die Kontrolle früheren Revisionen (ich nehme an, Sie haben die Versionskontrolle von irgendeiner Art) für die Existenz der Klasse. Wenn Sie die Deserialisierung ein Objekt erzeugt durch ein weiteres system check, system heraus auch.
versuchen Sie, sich anzumelden-Objekt in einer Datei (verwenden Sie var_export auf das Objekt und speichern es) rechts, bevor Sie zu serialisieren, die mit einem timestamp. Das nächste mal sehen Sie den Fehler überprüfen Sie das Protokoll, um zu sehen, die den Zustand des Objektes vor dem serialisieren, um zu bestätigen, das Objekt ist, wie erwartet, gehen in der Sitzung.
auch, Sie erwähnen, Sie haben eine FM_LoginLogging Klasse... ich benutze zend framework 1.x. Vor php 5.3, Zend hatte einen Haufen Arbeit Problemumgehungen für die Verwendung von Namensräumen und autoloading. Ich weiß, es erlaubt Sie, um namespace-und autoload-Klasse ohne Präfixe... so zum Beispiel eine Klasse FM_LoginLogging gesetzt werden konnte, um die autoload-sans "FM_" - Präfix. In diesem Fall'djust verwenden 'LoginLogging', und es würde die Karte Klasse. Etwas wie das könnte ein problem werden, wenn die PHP-speichert das Objekt mit es ist wahr, Klasse name, aber eine interne Objekt-Referenz innerhalb des Rahmens verwendet, der kurze Klassenname (oder Umgekehrt).
Es ist nicht ein Objekt oder ein Stück code, der Auslöser dieser. Wir sehen es ziemlich zufällig in der gesamten code-Basis, so dass die anderen debug-code irgendwo in der Nähe von einem echten Absturz ziemlich unmöglich. 'LogginLogging' ist ein Beispiel für eine ungültige Zeichenfolge, nicht etwas, was wir wollen, zu arbeiten. Die Klasse war vom Typ "ScormElement", und es gibt keine Art der Zuordnung zwischen den beiden. Die tatsächliche falsch-string unterscheidet sich in jedem Fall.
Laufen Sie diese in einen Rahmen? Zend, Cake, Symfony?
InformationsquelleAutor Ray
Ich verwenden Sie diese Funktion, um dieses problem zu lösen
InformationsquelleAutor IT Sekuro