Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 26-10-2007 14:47:48

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Serialisation et session d'un Zend_Db_Table_Abstract

Bonjour,

J'aimerais mettre un objet Zend_Db_Table_Abstract en session mais cela ne fonctionne pas, même en le serialisant.

Code:

Exemple :
$this->session->user = $this->fetchRow("id=".$id);

Quand je recupere sur une autre page :
$this->session->user->pagesvues = 15;
$this->session->user->save();

Sur le save il me remonte une erreur :  The script tried to execute a method or access a property of an incomplete object. Et en effet si je fait un print_r de mon objet en session il est __PHP_Incomplete_Class Object.

En le serialisant et deserialisant comme ceci j'ai le mm problème :

Code:

$this->session->user = serialize($this->fetchRow("id=".$id));
Quand je recupere sur une autre page :
$r = unserialize($this->session->user);
$r->pagesvues = 15;
$r->save();

Quelqu'un a t'il une idée ?

Hors ligne

 

#2 26-10-2007 16:11:32

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Serialisation et session d'un Zend_Db_Table_Abstract

Oui mettre un classe en session n'est possible que si la classe est chargée avant l'ouverture de la session
cela signifie qu'elle doit être chargée systématiquement  même lorsqu'on en a pas besoin.
sur une classe c'est jouable mais ça devient insérable si on commence en mettre plusieurs.

Je dit donc toujours aucun objet en session qui ne soit pas un simple StdClass object.

sur mes classes susceptible d'être enregistré en session je mets toujours une méthode toStdClass() qui me retourne le contenu de l'objet
si l'objet contient des objets je fais un appel récursif.

il faut aussi nettoyer son objet des données de travail comme les ressources.
par exemple un objet qui contient des données et un fileHandler ou une connexion LDP ou Db
Mettre les données en session est logique mettre la connexion n'a pas de sens car on ne pourra s'en servir après.

après le passage dans la session je récupère mon objet simple. celui qui le récupère à soit besoin des données et il s'en sert soit il a besoin aussi de rétablir les diverse connexion et il doit reconstruire l'objet original adapté à son contexte. c'est rarement le cas.

A+JYT
PS je n'aime pas les autoloads. il est normalement interdit d'avoir deux classe de même nom mais les librairies qu'on utilise ne se sont pas toujours concerté et là l'autoload peut avoir des conséquences ...

Hors ligne

 

#3 26-10-2007 16:36:33

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Serialisation et session d'un Zend_Db_Table_Abstract

Autoload ou pas, si tu as des librairies qui ont des classes de même nom, il y a des conséquences... L'autoload n'a pas grand chose à voir la dedans... ce n'est jamais qu'un moyen automatique de faire include....

Hors ligne

 

#4 26-10-2007 20:31:22

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Serialisation et session d'un Zend_Db_Table_Abstract

si ça a des conséquences car sans autoload tu maitrise celle que tu charge
tu peut donc faire attention de n'en charger qu'une et celle dont tu as besoin ça ne résout pas tout mais tu peux faire des choses
avec l'autoload tu ne sais absolument pas celle qui sera chargé et même si t'en charge qu'une tu n'est pas sur d'obtenir la bonne
donc pas d'autoload

Hors ligne

 

#5 27-10-2007 09:19:51

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Serialisation et session d'un Zend_Db_Table_Abstract

la procédure d'autoload, c'est toi qui l'écrit. Donc sauf si tu ne maitrises pas ce que tu écris, je ne vois pas comment tu ne maitrises pas ce que fait l'autoload.
Bref, moi j'utilise l'autoload et je n'ai aucun pb et ce n'est vraiment pas un petit site (environ 10 000 classes). J'y trouve une simplification du code et cela m'évite de charger des classes dont je n'ai plus besoin après évolution.
Mais chacun gère ses problèmes à sa manière hein... smile

Hors ligne

 

#6 27-10-2007 10:25:04

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: Serialisation et session d'un Zend_Db_Table_Abstract

Moi ce qui me freine avec l'autoload c'est les perfs j'ai un apprioris negatif le concernant.
Est ce que c'est fondé apprioris oui d'aprés ce que l'on lis a droite a gauche, mais je n'ai jamais vérifié par moi même : donc dans le doute je n'utilise plus l'autoload.

Hors ligne

 

#7 27-10-2007 11:32:00

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Serialisation et session d'un Zend_Db_Table_Abstract

Bah, les perfs, c'est assez facile de faire le pour et le contre.
Tu vas avoir un overhead du a l'autoload puisque tu as une procédure qui va se charger de retrouver le fichier et de faire l'include a ta place. C'est d'autant plus vraie si tu fais tes includes toi même. Ca l'est beaucoup moins dans le cas du ZF puisque tu passe par Zend_Loader::Loadclass qui est la meme fonction qui serait exécuter de facon automatique par l'autoload. Donc ici, quasi pas de gain si ce n'est le déclanchement de l'autoload mais qui est effectué par le core php et dont le coût est vraiment négligeable.
En revanche, il y a aussi des gains en perfs, j'en vois au moins 2, un sur et un probable :
1/ Avec l'auto l'autoload, tu peux systématiquement te contenter d'un include/require au lieu d'include_once/require_once. Même si à partir de la 5.2, il y a eu un gros effort sur les "xxx_once", ils ont toujours un  cout en ms nettement supérieur à la version non "once". De même, ils consomment plus de ram puisque il faut gérer un index des fichiers inclus. Ca, c'est un gain acquis certain et quantifiable.
2/ Si tu es sur un gros projet qui évolue sur du long terme, la gestion des inclusions devient un vrai casse tête et rapidement, on fini par inclure beaucoup trop de chose par apport a ce qui sera utilisé réellement. Car pour une page X tu aura besoin de tel ou tel fichier mais pas pour la page Y, sauf que les includes sont fait dans un fichier commun, du coup, tu pénalises la page Y. Idem, tu vas certainement utiliser des classes de débug lors du dev et il y a fort a parier qu'a un moment ou un autre, tu oubliera d'enlever l'include. Elles ne seront plus utilisées mais toujours inclues. Pareil pour les évolutions, besoin de tel classe a un moment puis plus après une évolution mais les includes restent. Ici le gain est néanmoins beaucoup plus difficile a quantifier

Quand on fait un peu de profiling php, on se rend vite compte que les includes coûte cher. Si tu veux, tu peux faire un truc tout bête, fait en fin de page un print_r(get_included_files()), tu seras certainement surpris par le nombre de fichiers inclus et tu trouvera peut être même des fichiers qui sont inclus et que tu avais oubliés et dont tu sait ne plus.

Maintenant, il faut aussi remettre les choses pour ce qu'elle sont. Si tu as des problèmes de perfs, ce n'est pas l'autoload qui changera quelque chose. Php, c'est gentil, mais sans un système de cache (op-code et page partiel ou total), tu ne peux pas attendre des perfs mirobolantes sur un site a forte fréquentation. Et c'est via un cache bien pensé que tu peux obtenir de très bonnes perfs même sur un serveur moyen. Et php n'est pas la seule solution pour améliorer les perfs, il y a tout ce qui se passe en amont avant d'avoir la main sur php. Je suis justement en train de travailler sur la phase final d'optimisation du nouveau site que nous préparons. Il est basé sur le ZF et dès qu'il sera online, je donnerais l'url.

Hors ligne

 

#8 27-10-2007 14:59:26

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Serialisation et session d'un Zend_Db_Table_Abstract

Non si tu inclus les classes dont tu as besoin au moment ou tu en as besoin il n'y a aucun pb de chargement tu ne pénalise aucune page par rapport à un autre.
ensuite si ta classe elle doit dans une circonstance donnée doit charger une autre à elle de le définir et donc tu ne charge pas systématiquement les deux toit tu charge celle dont tu as besoin et si elle passe par le chargement d'une autre ce ne sera que dans le cas ou tu en as indirectement besoin.

en faisant ainsi si tu enlève une classe suite à une évolution toute les classe qu'elle même chargeait ne le sont plus.

Quant à une éventuelle classe Debug il suffit de ne la charger qu'une fois au démarrage. Ainsi il est très simple de la supprimer.

quant à l'autoload il faudra qu'on m"explique comment à priori je peu savoir que l'url 1 doit charger la classe Machin du dossier1 et que l'url 2 doit charger la classe de même nom Machin dans le dossier2.
j'ai beau essayer de comprendre quand le choix de la classe dépends de l'exécution et qu'elles ont le même nom l'autoload ne peut que prendre celle qui a été défini A PRIORI ce qui n'est pas forcément ce qu'on attend.
Je préfère donc me passer de cette fonctionalité. surtout que Charger les classes dont on a besoin est tout de même particulièrement simple.

il suffit par exemple de ne ma mettre les loadClass hors des méthodes de la classes sauf pour la classe parente et les classes utilisées systématiquement par cette qu'on écrit.

Alors ne sont chargé que les classes réellement utile et identifiées à coup sur.

Mais je sais qu'autoload est utilisé c'est juste un choix personnel.
A+JYT
PS: cela n'enlève pas le problème de ne pouvoir utiliser deux classes de même nom (issue de deux librairie) en même temps

Hors ligne

 

#9 29-10-2007 09:28:09

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Serialisation et session d'un Zend_Db_Table_Abstract

Bah je ne cherche pas a te convaincre non plus, moi j'y trouve mon compte car je n'ai plus a gérer les includes et je suis absolument certain a tout moment ne ne jamais inclure un fichier dont je n'aurait plus besoin. Et même avec une bonne gestion des includes, je n'aurait jamais pu dire cela avant.
Quand a utiliser plusieurs frameworks ou librairie ayant des noms de classes identique, c'est forcement contraignant. Déjà il faut faire un choix entre la fonctionnalité 1 et 2 tout en sachant qu'on ne pourra jamais avoir les 2 (perso, quand j'ajoute une lib, j'aurai bien du mal a exclure les autres).  Ceci étant dit, si toi, tu es capables d'identifier quel lib utiliser, pourquoi ne serait tu pas capable de coder la logique qui identifie ce besoin ?

Je voie au moins 4 possibilités :
- Tu définie une procédure d'autoload pour chaque framework/lib et tu actives la procédure idoine  en fonction de tes besoins.
- Tu fais une seule procédure avec un flag d'aiguillage que tu gères en fonction de tes besoins.
- Tu fais plusieurs procédures toujours active et qui suivent un flag d'aiguillage (mix des 2 solutions précédentes)
- Tu peux aussi faire un aiguillage automatique en fonction de la présence de certaine classe  principale qui sont unique dans chaque framework.

bref, je ne pense pas que ce cas de figure serait bloquant s'il devait m'arriver d'avoir a utiliser 2 lib ayant des noms de classe identique, je serais en revanche beaucoup plus soucieux des conséquences éventuelles sur les caches d'op code...

Dernière modification par TiTerm (29-10-2007 09:28:33)

Hors ligne

 

#10 29-10-2007 12:05:14

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Serialisation et session d'un Zend_Db_Table_Abstract

les cache d'op code identifie les classes en fonction de leur nom mais aussi de le position sur le disque donc lorsque tu charge une classe dont une autre ayant le même nom à été chargé dans un autre script en dehors de l'exécution courante l'opcode en cache n'est pas valide et donc un autre op code est chargé
par la suis Zend sais faire la différence entre les deux.

A+JYT

Hors ligne

 

#11 27-11-2007 21:37:35

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: Serialisation et session d'un Zend_Db_Table_Abstract

Tiens, ce 'débat' me rappelle la conférence qu'a donnée Derick au forum PHP AFUP il y a peu.
Le slide est dispo ici.
Derick a expliqué clairement le processus de l'inclusion de fichier, et des noms de fonction.
Il avoue lui même utiliser l'autoload, car le confort est très intéressant. Il a évidemment dit que ca avait des impacts sur les performances ( tout comme le _once {include ou require} ), mais qui ne sont pas énormes non plus.
Un cache opcode (tel APC dont on a eu une belle démo aussi {facebook}) sait très bien gérer ces problèmes là, à condition qu'il soit configuré correctement. ;-)

Hors ligne

 

#12 28-11-2007 12:22:12

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: Serialisation et session d'un Zend_Db_Table_Abstract

Moimeme a écrit:

Bonjour,

J'aimerais mettre un objet Zend_Db_Table_Abstract en session mais cela ne fonctionne pas, même en le serialisant.

Je ne sais pas si c'est du à une mise à jour mais ça marche sans problème :

il faut juste savoir que une fois déséralisé,  ton Row est en lecture seul, pour faire un save() il faut le reconnecter avec sa table.

En reprenant l'exemple de la Doc :

Code:

$bugs = new Bugs();
$row = $bugs->fetchRow('bug_id = 1');

// Convert object to serialized form
$serializedRow = serialize($row);


//------------- Dans une autre page ----------------//

$rowClone = unserialize($serializedRow);

// Now you can use object properties, but read-only
echo $rowClone->bug_description;



$bugs = new Bugs();

// Reconnect the row to a table, and
// thus to a live database connection
$rowClone->setTable($bugs);

// Now you can make changes to the row and save them
$rowClone->bug_status = 'FIXED';
$rowClone->save();

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages