[Answered] PHP Fatal error...

Hi everyone,

I get regularly this php fatal error message on a fresh 1.8.7.1 installation:

PHP Fatal error:  main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "learnpath" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition  in /chamilo/main/newscorm/lp_content.php on line 19, referer: http://www.ticfp.qc.ca/main/newscorm/lp_controller.php?action=view&lp_id... -> different courses in fact.

I get this on a, Ubuntu server version 10.04 LTS (Lucid) -> PHP 5.3.2, Apache 2.2.14, MySQL 5.1.41.

Can anyone help me with this.  We just switch from Dokeos 1.8.6 to Chamilo 1.8.7.1 and it's been quite heavy to do it.  This server is pretty busy 1500 courses with peaks of 170 simultaneous users.

Everything is going pretty well now but this fatal error.

Thanks!

Michel

+++++++++++++++++++++++++++++++++++++++++++++++++=

Comments

The fatal error is very strange (and unprecedented there)

Hi Michel,

The fatal error is very strange (and unprecedented there). We use Ubuntu Lucid all the time and don't have this problem.

Given it is a migration from Dokeos(TM), could you please check that all the files in main/newscorm/ have been overwritten with the contents of the Chamilo package? I understand the error message, I just don't understand how you could get to this situation. Are you in some way relying on a direct link to the content for this course?

Please send me a reminder through my contact form if I don't answer (sometimes I don't get the notifications).

Yannick

Bonjour Yannick, Je passe en

Bonjour Yannick,

Je passe en français. 

Je dois tout d'abord te mentionner qu'il s'agit de la plateforme TicFP (http://www.ticfp.qc.ca) et que je travaille depuis le début (Claroline à l'époque) avec André Boivin sur ce projet, mais plus au niveau de l'administration des systèmes et du réseau. Nous avons fait beaucoup de modifications et d'ajouts à ce Dokeos.  Il n'est donc pas surprenant pour nous de voir apparaître ce genre de bug dans notre Chamilo.

Étant donné la situation,  nous allons donc commencer par faire une comparaison entre nos fichiers du répertoire "main/newscorm et ceux de Chamilo et tenter de déterminer la cause du message d'erreur.

Ceci dit, tu affirmes comprendre le message d'erreur, mais sans toutefois comprendre comment nous en sommes arrivés là !

Pourrais-tu à ce sujet nous donner quelques indications qui nous aideraient à comprendre/résoudre le problème.

Merci!

Michel

++++++++++++++++++++++++++++++++++++=

Bonjour Michel, Je reprends

Bonjour Michel,

Je reprends le message d'erreur pour l'expliquer un peu...

PHP Fatal error:  main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "learnpath" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition  in /chamilo/main/newscorm/lp_content.php on line 19, referer: http://www.ticfp.qc.ca/main/newscorm/lp_controller.php?action=view&lp_id... -> different courses in fact.

Il y a plusieurs éléments sensibles ici:

  1. Nous sommes dans l'outil learning path, au moment de récupérer un objet de type "learnpath" qui a été précédemment stocké dans une session. Il n'y a que dans ce cas-là que ce genre d'erreur a du sens, et l'url semble le confirmer (lp_controller.php?action=view)
  2. "incomplete object" est une erreur qui se produit parfois lorsque l'installation de Chamilo stocke les sessions PHP dans la base de données plutôt que sur le disque. Si c'est le cas, il faudrait vérifier la taille autorisée pour les données de sessions dans la table (de mémoire) main.php_session. Dans le cas où cette table ne permet pas suffisamment de données pour stocker tout un itinéraire d'apprentissage (ou du moins son image en mémoire), alors il peut se produire, entre deux pages, une troncature de cet itinéraire. Au moment de le restaurer, l'image stockée en mémoire ne permet pas de "fermer" les éléments qui ont été ouverts (des tableaux, etc) et le processus entre en mode d'erreur
  3. class definition "learnpath" of the object you are trying to operate was loaded _before_ unserialize(), ça c'est un principe de l'orienté objet particulièrement utile avec PHP. Si j'ai un objet en mémoire et que je veux le stocker sur le disque (=en session PHP) pendant un temps jusqu'à ce que l'utilisateur en ait encore besoin, je dois "sérialiser" mon objet (ou, disons, l'aplatir sous forme de string). Au moment de le récupérer, afin de pouvoir re-modéliser l'objet à partir de la string, je dois connaître la définition de l'objet (quels attributs, méthodes, etc il a). Si la définition de la classe "learnpath" n'a pas été chargée avant de récupérer les objets de la session et de lancer un "unserialize", mon processus me dira qu'il est impossible de reconstruire l'objet (et donc entre en mode d'erreur) - c'est vérifiable dans lp_content.php, ligne 19, probablement (on y fait sans doute un unserialize($_SESSION['lp'] ou quelque chose comme ça)
  4. Enfin, __autoload() est un mécanisme que nous n'utilisons pas dans le code de Chamilo, mais qui permet de charger la définition des classes à la demande. PHP suggère donc ici que le mécanisme ne serait pas bien configuré. Mais encore une fois, nous ne l'utilisons pas.

Avec tout ça, j'espère que tu pourras avancer...

Yannick

Du nouveau,...

Bonjour Yannick,

J'ai réussi à reproduire notre bug.  J'essaierai d'être le plus précis possible, simplement.  Alors voici:

Si je crée un nouveau parcours dans un cours quelconque, on me demande d'abord un nom -> Premier parcours

Je décide ensuite de créer un premier chapitre -> Chap 1

Je décide ensuite de créer une nouvelle étape -> Nouveau document -> Document 1 -> parent (je n'apporte aucune modif) -> position (aucune modif) -> bla bla bla -> Ajouter cette page

Dès cet instant, si je vais à la racine de ce cours et que je clique sur Premier parcours, la page s'ouvre et pointe sur Chap 1 dans la barre de navigation et la page centrale est blanche parce qu'aucun contenu n'est associé à un titre de chapitre.

C'est à cet instant précis que j'obtiens cette erreur.

Maintenant, si je clique sur le lien Organiser et que je déplace le document (Document 1) au-dessus du chapitre (Chap 1) dans la barre de navigation, et que je retourne à la racine du cours et que je reclique sur Premier parcours, la page bla bla bla s'affiche et je n'obtiens aucune erreur.

En résumé, à chaque fois que le parcours d'un cours pointe à l'ouverture sur un chapitre, j'obtiens ce message d'erreur.

Ceci dit, est-ce que cette erreur dépend d'un de nos ajouts/modifs de fonctions, je ne sais pas.

D'après toi?

Merci !

Michel

+++++++++++++++++++++++++++++++++++++++++++=