Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 11-11-2008 13:09:20

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Pb de sérialization: You cannot serialize or unserialize PDO

Bonjour à tous,

j'ai un problème de sérialization car j'utilise un cache.

En gros j'ai une classe jeu qui appartient à mon modele. Dans cette classe jeu, j'ai une fonction que je souhaite mettre en cache qui récupère une liste de jeux en fonction d'options mais également par rapport à un numéro de page et un nombre d'éléments affichés.

En retour je renvoi un tableau qui contient l'objet Zend_Paginator et le tableau de résultat (car je fais un traitement avant de le retourner.

Bon passons au code:

Code:

class Jeux extends Zend_Db_Table_Abstract {
    ....
static function getListGame($option, $page = 1, $limit = 20){
         ....
    $jeux = new Jeux();    
    $select = $jeux->select();
         ...
        $paginator = Zend_Paginator::factory($select); 
    $paginator->setItemCountPerPage( $limit );
    $paginator->setCurrentPageNumber( $page );
         
       $res = array();
        foreach ($paginator as $val){
           ... traitement de $res //tableau de résultat formaté
       }       

    return array(
            "resFormatte"         => $res,
            "paginator"        => $paginator
    );
}
}

Cette fonction fonctionne parfaitement sans utilisation du cache. (La méthode étant caché au niveau du controlleur). Or dès lors que l'on active le cache celui ci retourne un message d'erreur:

Code:

You cannot serialize or unserialize PDO instances

Si j'ajoute serialize au niveau de l'objet paginator, Il n'y a aucun changement. J'ai le même message d'erreur.

Note:
Je pourrais sortir l'objet $paginator et le traiter au niveau du controleur mais dans ce cas le tableau retourné ne contient que les données à afficher et non toutes les informations relatives à la pagination.

Une idée ?

Hors ligne

 

#2 11-11-2008 15:27:28

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

Re: Pb de sérialization: You cannot serialize or unserialize PDO

on ne peut serialiser ou désérialiser une ressource.

par exemple si tu ouvre un fichier fopen va te retourner une référence sur un descripteur de fichier. si tu garde cette référence pour l'utiliser en suite (cache ou session) le fichier aura été fermé et la référence sera invalide.

avec les ressources PDO il en va de même. il te faut donc soit garder la description qui te permettra de recréer la ressource (ie le non du fichier avec fopen) soit extraire toutes les données et les mettre en cache.
une alternative et de mettre en cache et la description de la ressource pour la recréer et les données déjà lue. mais alors la gestions du cache et de l'objet PDo sera compliqué.

A+JYT

Hors ligne

 

#3 11-11-2008 16:32:46

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

Re: Pb de sérialization: You cannot serialize or unserialize PDO

J'ai un patch pour ça, mais il risque d'arriver trop tard pour la 1.7
http://framework.zend.com/issues/browse/ZF-4600

Hors ligne

 

#4 11-11-2008 18:27:36

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb de sérialization: You cannot serialize or unserialize PDO

@julien. Je capte pas trop comment mettre en place le patch. est ce que tu peux m'expliquer SVP

Hors ligne

 

#5 12-11-2008 11:36:10

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb de sérialization: You cannot serialize or unserialize PDO

J'ai pensez à un truc mais bon je trouve ça moyen et en plus ça ne marche pas top: donc attention peut être c'est une idée de merde

voila l'idée:
à la place de retourner la paginator, je retourne le select et je recrée l'instance paginator dans le contrôleur. Sauf qu'après qq tests, le select retourne forcément le même problème que paginator.

Que pensez vous de l'idée ? même si ça ne marche pas encore

Peut être qu'une fois que j'aurais compris le patch de julien, ça va fonctionner.

Hors ligne

 

#6 13-11-2008 11:00:19

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb de sérialization: You cannot serialize or unserialize PDO

ça n'inspire personne ?

Hors ligne

 

#7 13-11-2008 17:40:20

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

Re: Pb de sérialization: You cannot serialize or unserialize PDO

svn patch <fichier_a_patcher> <fichier_de_patch>

Ca sera pas inclut en 1.7 car freezé, mais pour une version ultérieure.
Il me reste un peu de travail à faire dessus.

Hors ligne

 

#8 14-11-2008 15:45:23

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb de sérialization: You cannot serialize or unserialize PDO

Julien a écrit:

svn patch <fichier_a_patcher> <fichier_de_patch>

Ca sera pas inclut en 1.7 car freezé, mais pour une version ultérieure.
Il me reste un peu de travail à faire dessus.

Ok merci, j'ai réussit à appliquer mon patch.
Cependant j'ai toujours le même message d'erreur peut être que j'ai oublié une étape mais j'ai bien regardé les Use Cases.

en gros dans ma fonction getListGame j'ai fais un test:

static function getListGame($option, $page = 1, $limit = 20){
       ....
    $jeux = new Jeux();   
//$select est une instance de Zend_Db_Table_Select(), peut etre la raison de mon erreur
    $select = $jeux->select();
         ...

    return $select;

}

et lorsque j'essaye de mettre la fonction en cache via le frontend Class (Zend_Cache_Frontend_Class) ça me génère la même erreur : You cannot serialize or unserialize PDO instances

Tu vois d'ou peux venir mon pb ?

Hors ligne

 

#9 17-11-2008 10:08:33

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

Re: Pb de sérialization: You cannot serialize or unserialize PDO

Désolé mais sans le code je peux pas faire grand chose.
Une instance de PDO se fait sérialisée, reste à passer le déboggeur et corriger.

Hors ligne

 

#10 17-11-2008 22:41:47

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb de sérialization: You cannot serialize or unserialize PDO

ok je vais essayer de développer:

donc j'ai une classe modèle: Jeux avec une fonction getListGame (je vais un peu plus la détailler):

Code:

static function getListGame($option, $page = 1, $limit = 20){
       ....
    $jeux = new Jeux();   
   //$select est une instance de Zend_Db_Table_Select(), peut etre la raison de mon erreur
    $select = $jeux->select();
         ...

    return array(
            "resFormatte"    => $res, //$res est le résultat ou l'on a appliqué un traitement
            "select"        => $select
   );

}

Cette fonction est appelé depuis le controlleur jeu:

Code:

class JeuxController extends Zend_Controller_Action{
...
    public function indexAction() {

            $cacheJeuxStatic     = My_ClassCache::factory( "Jeux" );
        $listCurrentGame =  $cacheJeuxStatic->getListGame( $option, $pPage, $pLimit  );
        
            $paginator = Zend_Paginator::factory($listCurrentGame["select"]);
        $paginator->setItemCountPerPage( $pLimit );
        $paginator->setCurrentPageNumber( $pPage );
       }

}

Voila la class My_ClassCache qui permet de mettre en cache le résultat

Code:

class My_ClassCache {
    
    /**
     * Singleton instance
     *
     */
    protected static $_cache = null;
    private static $frontend;
    private static $backend;
    private static $frontendOptions;
    private static $backendOptions;
    
    //Initialise les options du cache de class
    public static function init($frontend, $backend, $frontendOptions, $backendOptions){
        
        self::$frontend         = $frontend;
        self::$backend             = $backend;
        self::$frontendOptions     = $frontendOptions;
        self::$backendOptions     = $backendOptions;
        
    }
    
    //Retourne l'instance de la classe de cache
    public static function factory( $classInstance){
        self::$frontendOptions["cached_entity"] = $classInstance;
        return Zend_Cache::factory(self::$frontend, self::$backend, self::$frontendOptions, self::$backendOptions);
    }
    
}

et dans le bootstrap

Code:

/
//$config  est une variable de Zend_Registry

$frontend             = "Class";
$backend          = "File";
$frontendOptions     = array(
                        "caching"    => $config->cache->activate,
                        "lifetime"    => $config->cache->lifetime
                    );
$backendOptions     = array( 'cache_dir' => '../cache/class/');

My_ClassCache::init($frontend, $backend, $frontendOptions, $backendOptions);

j'espère avoir été assez précis.
N'hésite pas si  y a qq chose de pas claire

Dernière modification par bucheron (17-11-2008 22:46:05)

Hors ligne

 

#11 19-11-2008 22:58:59

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

Re: Pb de sérialization: You cannot serialize or unserialize PDO

Oui c'est bien ça, tu mets un objet Zend_Db_Select dans le cache ....

Hors ligne

 

#12 25-11-2008 10:34:24

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb de sérialization: You cannot serialize or unserialize PDO

donc en gros si j'ai bien compris ce que tu m'as dit ça devrait marcher avec la mise en place de ton patch ?
Or chez moi ça génère une erreur et le problème c est que je ne sais pas trop comment trouver la solution à mon pb.

Hors ligne

 

#13 27-11-2008 16:12:24

bucheron
Membre
Date d'inscription: 30-05-2008
Messages: 138

Re: Pb de sérialization: You cannot serialize or unserialize PDO

petit up du post smile

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