__PHP_Incomplete_Class_Name errato

Stiamo ottenendo casualmente dei registri degli errori molto strani. Non accadono su each colpo di pagina, anche con gli stessi parametri / azioni / ecc., E non sembrano ripetibili, ognuno è diverso nella sua posizione di arresto e context. Ma quasi tutti hanno errato __PHP_Incomplete_Class_Name come causa.

Uno di questi errori è:

main (): lo script ha cercato di eseguire un metodo o accedere a una properties; di un object incompleto. Assicurati che la definizione di class "LoginLogging" dell'object che stai cercando di operare sia stata caricata prima che unserialize () venga chiamata o fornisca una function __autoload () per caricare la definizione della class

Il problema è che non esiste una class "LoginLogging". L'object a cui si riferiva era di tipo ScormElement quando è stato salvato nella session. Fare un dump della variabile dà:

__PHP_Incomplete_Class::__set_state(arrays( '__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(arrays( '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' => arrays (), '__blnRestored' => true, 'objUser' => NULL, 'objScorm' => NULL, ) 

Tutte le properties; vengono mantenute correttamente e corrispondono alla definizione di class per ScormElement. Ma il nome della class è sbagliato. Non esiste una class denominata LoginLogging.

Che cosa sta causando questo e come lo ripariamo ???

Modifica : questo è solo un esempio. Altri errori sono molto simili nella struttura, ma influenzano altri tipi di classi e hanno nomi incompleti diversi. Tuttavia, TUTTI i nomi incompleti hanno la stessa lunghezza di string del nome corretto della class.

Modifica 27/10/2011 : visualizzo ancora questi log degli errori e non sono riuscito a trovare una soluzione. Qualsiasi aiuto sarebbe apprezzato.

PHP 5.3.3, APC, gestore di session predefinito.

Come scritto nella citazione nella tua domanda __PHP_Incomplete_Class_Name è un nome di class speciale in PHP che viene utilizzato each volta che non è ansible trovare la definizione della class quando unserializing ( unserialize() ).

Si suggerisce di garantire che la definizione della class sia disponibile o di fornire un autoloading per la class mancante.

Hai commentato che PHP sta cercando il nome di class sbagliato qui:

 wrong: LoginLogging right: ScormElement 

È difficile dire con le informazioni fornite perché il nome della class viene modificato in caso di serializzazione / unserializzazione. Le informazioni che hai fornito (in particolare la discarica) nella tua domanda sono incomplete .

Quindi le opzioni sono limitate ad alcuni suggerimenti generali:

È ansible controllare la string serializzata in cui viene fornito il nome class in modo da poter dire alless se avviene con serializzazione o unserialization. È ansible ispezionare facilmente i dati serializzati con la libreria serializzata di PHP che ha uno scaricatore di text a scopo di debug.

Inoltre c'è unserialize_callback_func Ini-Directive che puoi usare per tracciare ulteriormente il problema.

 <?php $serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}'; // unserialize_callback_func directive available as of PHP 4.2.0 ini_set('unserialize_callback_func', 'mycallback'); // set your callback_function function mycallback($classname) { // just include a file containing your classdefinition // you get $classname to figure out which classdefinition is required } 

Mentre scrivi il problema non si verifica più, sospetto che a un certo punto la serializzazione sul tuo sito sia stata interrotta conservando dati non validi. Quale framework / librerie / applicazione stai usando? Quale componente si occupa della serializzazione?

Se stai tentando di accedere a un metodo di properties; di un object o di un valore serializzato che hai memorizzato in una variabile $ _SESSION e hai incluso la class dopo aver chiamato session_start () prova a includere la class prima di call session_start ();

Sei, per caso, utilizzando qualche cache opcode (ad es. APC, XCache) o un debugger? A volte fanno accadere cose strane. Se non c'è e non è mai stata una class LoginLogging nel tuo progetto, ma il tuo non è l'unico progetto sul server, vorrei fare un'offerta sulla cache.

Questo accade quando proviamo a inizializzare la session prima di caricare le definizioni di class per l'object che stiamo cercando di salvare nella session.

puoi usare semplicemente i methods json in PHP

json_encode quella matrix e ancora json_decode quella matrix e la salva in una variabile e poi printing quella variabile. otterrai una matrix semplice.

per esempio.

 $arrays = arrays(); // this is your arrays variable to whom you are trying to save in a session $encode = json_encode($arrays); $decode = json_decode($encode); echo '<pre>'; print_r($decode); 

functionrà sicuramente.

Il suggerimento di Hakre di guardare session_write_close mi ha portto a quella che sembra essere una soluzione affidabile:

 register_shutdown_function('session_write_close'); 

Ciò impone la scrittura della session prima che si verifichi la pulizia della memory e lo scaricamento della class. Questo è importnte a causa di un cambiamento in PHP che può causare una condizione di competizione tra APC che rimuove i riferimenti alle classi e PHP che scrive i dati della session: http://news.php.net/php.internals/46999

Per includere la class prima che session_start () funzioni bene per me. =)

Quando provi a unserializzare una variabile, php deve conoscere la struttura dell'object. Prova a includere la tua class prima di unserialize. Quale class? quello che contiene quelle properties; mostrate nel tuo codice. include ('pathtoyourclass / classname.php') o include_once ('pathtoyourclass / classname.php').

In bocca al lupo!

È il problema di serializzazione nel tuo codice. Potrebbe essere che il tuo codice per qualche ragione non potrebbe inizializzare l'object e nella parte successiva del tuo codice prova a convertire quell'object in string o in qualche altro tipo di dati.

Ispeziona il tuo codice, inizializza correttamente i tuoi oggetti.

Controlla se stai usando il metodo serialize () / unserialize ().

Stai ricevendo questo object serializzato da un servizio / stream o leggendolo da un file? Ho visto accadere in un client-server che imposta l'object lato client e gli oggetti lato server differiscono leggermente … forse hanno una properties; che l'altro non ha. Questo accade anche quando serializzi un object, lo salvi in ​​un file, quindi un codice refactoring che rimuove una class e poi prova a deserializzare l'object.

Quindi, quando viene deserializzato e tenta di creare un'istanza delle classi necessarie, esse non esistono.

L'errore è chiaro e diretto, stai creando un object per il quale la class non è stata caricata.

Farei una ricerca di stringhe sul tuo codice, trovare where si trova la class necessaria e creare un semplice autoloader (o solo un raw include / require) del file. Prendi in qualche modo la class di cui ha bisogno.

Se la class in realtà non esiste da nessuna parte, prova a verificare le revisioni precedenti (presumo che tu abbia il controllo della versione di qualche tipo) per l'esistenza della class. Se stai deserializzando un object generato da un altro sistema, controlla anche quel sistema.

Io uso questa function per risolvere questo problema

 $user = $_SESSION['login']; $auth_user= fixObject($user); function fixObject(&$object) { if (!is_object($object) && gettype($object) == 'object') return ($object = unserialize(serialize($object))); return $object; }