Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-08-2009 22:06:35

thb
Membre
Date d'inscription: 10-04-2009
Messages: 10

[1.8][Zend_Cache] Utilisation du cache de page

Bonjour,

J'ai implémenté le cache de page, dans une application existante mais cela ne fonctionne pas correctement.

La page est mise en cache, mais en cas de rappel de la même page, une nouvelle page est mise en cache, sans faire appel à celle déjà présente dans le cache !

Voici mon code :

Code:

   

$frontendOptions = array(
   'lifetime'         => 7200, 
   'debug_header'     => true, // pour tester
   'memorize_headers' => array('Content-Type',
                               'Content-Language',
                               'Content-Disposition',
                               'Content-Length',
                               'Content-Transfer-Encoding',
                               ),
   'cache_id_prefix'  => null,
   'automatic_cleaning_factor' => 0,
   'default_options'  => array(
                               'cache_with_cookie_variables'   => true,
                               'cache_with_session_variables'  => true,
                               'cache_with_get_variables'      => true,
                               'cache_with_post_variables'     => true,
                               'make_id_with_get_variables'    => true,
                               'make_id_with_post_variables'   => true,
                               ),
   'regexps'          => array(
       '^/$'               => array('cache' => true),
       '^/index/'          => array('cache' => true),
       '^/index/mention/'  => array('cache' => true),
       '^/index/plan/'     => array('cache' => true),
       '^/article/'        => array('cache' => true),
       '^/contact/'        => array('cache' => true),
       '^/document/'       => array('cache' => true),
       '^/recherche/'      => array('cache' => true),
       '^/rubrique/'       => array('cache' => false),
       '^/xml/'            => array('cache' => true),
       '^/xml/opensearch/' => array('cache' => true),
       '^/xml/p3p/'        => array('cache' => true),
       '^/xml/policy/'     => array('cache' => true),
       '^/xml/rss/'        => array('cache' => true),
       '^/xml/sitemap/'    => array('cache' => true),
   )
);
$backendOptions = array(
    'cache_dir'              => APP_PATH . '/cache/frontend/',
    'read_control'           => true,
    'read_control_type'      => 'crc32',
    'hashed_directory_level' => 0,
    'file_name_prefix'       => 'zend_cache'
);

// obtenir un objet Zend_Cache_Frontend_Page
$cache = Zend_Cache::factory('Page',
                             'File',
                             $frontendOptions,
                             $backendOptions);
// lancement de la gestion du cache
$cache->start();

Avez-vous une idée ?

Merci d'avance :)

Hors ligne

 

#2 30-08-2009 20:47:25

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [1.8][Zend_Cache] Utilisation du cache de page

je m'intéresse au cache de page mais je ne sais comment vérifier si oui ou non sa l'est bien mis. Si j'en savais plus je t'aiderais volontier. Où as tu vu tout ceci?

Hors ligne

 

#3 31-08-2009 11:38:35

thb
Membre
Date d'inscription: 10-04-2009
Messages: 10

Re: [1.8][Zend_Cache] Utilisation du cache de page

Après avoir cherché, j'ai trouvé la solution : il faut faire attention à tous les "cache_with_*" et les "'make_id_with_*" !

Voici le code corrigé :

Code:

$frontendOptions = array(
   'lifetime'         => 7200, 
   'debug_header'     => true, // pour tester (false en production)
   'memorize_headers' => array('Content-Type',
                               'Content-Language',
                               'Content-Disposition',
                               'Content-Length',
                               'Content-Transfer-Encoding',
                               ),
   'cache_id_prefix'  => null,
   'automatic_cleaning_factor' => 0,
   'default_options'  => array(
                               'cache_with_cookie_variables'    => true,
                               'cache_with_session_variables'   => false,
                               'cache_with_files_variables'     => false,
                               'cache_with_get_variables'       => true,
                               'cache_with_post_variables'      => true,
                               'make_id_with_cookie_variables'  => false,
                               'make_id_with_session_variables' => false,
                               'make_id_with_files_variables'   => false,
                               'make_id_with_get_variables'     => true,
                               'make_id_with_post_variables'    => true,
                               ),
   'regexps'          => array(
       '^/$'               => array('cache' => true),
       '^/index/'          => array('cache' => true),
       '^/index/mention/'  => array('cache' => true),
       '^/index/plan/'     => array('cache' => true),
       '^/article/'        => array('cache' => true),
       '^/contact/'        => array('cache' => true),
       '^/document/'       => array('cache' => true),
       '^/recherche/'      => array('cache' => true),
       '^/rubrique/'       => array('cache' => true),
       '^/xml/'            => array('cache' => true),
       '^/xml/opensearch/' => array('cache' => true),
       '^/xml/p3p/'        => array('cache' => true),
       '^/xml/policy/'     => array('cache' => true),
       '^/xml/rss/'        => array('cache' => true),
       '^/xml/sitemap/'    => array('cache' => true),
   )
);
$backendOptions = array(
    'cache_dir'              => APP_PATH . '/cache/frontend/',
    'read_control'           => true,
    'read_control_type'      => 'crc32',
    'hashed_directory_level' => 0,
    'file_name_prefix'       => 'zend_cache'
);

// obtenir un objet Zend_Cache_Frontend_Page
$cache = Zend_Cache::factory('Page',
                             'File',
                             $frontendOptions,
                             $backendOptions);
// lancement de la gestion du cache
$cache->start();

Sinon pour répondre à la question, voir la documentation officielle : http://framework.zend.com/manual/fr/zen … cache.html

Hors ligne

 

#4 31-08-2009 15:01:43

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [1.8][Zend_Cache] Utilisation du cache de page

merci j'ai regardé et je me suis servi de ce que tu as fait pour le cache. J'ai juste un problème.

Quand sur une page je post un commentaire par exemple. Bah sa me remet la page en cache et non la nouvelle avec l'ajout. Voici les réglages que j'ai fais (mis dans le bootstrap):

Code:

protected function _initUsePageCache()
    {
        $frontendOptions = array(
                'lifetime' => 10800,
                'debug_header' => true,
                'memorize_headers' => array('Content-Type',
                               'Content-Language',
                               'Content-Disposition',
                               'Content-Length',
                               'Content-Transfer-Encoding',
                               ),
        
                'default_options' => array(
                    // disable default caching for all requests
                    //'cache' => false,
                    'cache_with_files_variables'     => false,
                    'cache_with_post_variables'      => false,
                    'cache_with_cookie_variables'    => true,
                    'cache_with_session_variables'   => true,
                    'cache_with_get_variables'       => true,
                    
                    'make_id_with_cookie_variables'  => true,
                    'make_id_with_session_variables' => true,
                    'make_id_with_files_variables'   => true,
                    'make_id_with_get_variables'     => true,
                    'make_id_with_post_variables'    => true,
        
                ),
                // cache routes to Index and News controllers
                
                //le module client n'apparait pas de peur d'avoir un bug à cause des sessions
                'regexps' => array(
                    '^/$'                     => array('cache' => true),
                    '^/index/'                => array('cache' => true),
                    '^/bien/'                 => array('cache' => true),
                    '^/commentaires/'         => array('cache' => false),
                    '^/galerie/'            => array('cache' => true),
                    '^/fiches/'                => array('cache' => false),
                    '^/recherche/'            => array('cache' => true),
                    '^/client/index/'        => array('cache' => false),
                    '^/client/private/'        => array('cache' => false),
                )
        );
        
        $backendOptions = array(
            'cache_dir'              => APPLICATION_PATH . '/cache/',
            'read_control'           => true,
            'read_control_type'      => 'crc32',
            'hashed_directory_level' => 0,
            'file_name_prefix'       => 'zend_cache'
        );
        
        $cache = Zend_Cache::factory(
                'Page',
                'File',
                $frontendOptions,
                $backendOptions
        );
        // serve cached page (if it exists) and exit
        $cache->start();
        
    }

A la fin de chaque envoi de forum, à la fin de l'enregistrement je fais un $this->_redirect() vers la page souhaitée. Il n'est pas possible qu'il recréé le cache de la page après un postage?? quand j'ai une erreur au formulaire sa m'affiche le nouveau, sinon sa ne le fais pas.
Idem pour les pages que je veux mettre en cache ou pas, il me les met toutes automatiquement même si j'en mets à false.

Dernière modification par throrin19 (31-08-2009 15:50:17)

Hors ligne

 

#5 01-09-2009 10:50:10

thb
Membre
Date d'inscription: 10-04-2009
Messages: 10

Re: [1.8][Zend_Cache] Utilisation du cache de page

Il faut vider le cache lorsqu'une modification (ajout/modification/suppression dans la base de données la plupart du temps) entrainant un changement dans la page à afficher intervient.

Pour cela faire :

Code:

...
$cache->start();
// stocke la référence du cache en registre
Zend_Registry::set('cache',$cache);

Puis lors de la modification des données :

Code:

$cache = Zend_Registry::get('cache');
// suppression de tout le cache de page
$cache->clean(Zend_Cache::CLEANING_MODE_ALL);

On peut faire plus 'fin' que la suppression de tout le cache (CLEANING_MODE_ALL), pour cela on peut utiliser des "tags", voir http://framework.zend.com/manual/fr/zen … heory.html

Hors ligne

 

#6 01-09-2009 11:22:43

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [1.8][Zend_Cache] Utilisation du cache de page

merci, je vais tester celà de ce pas et voir ce que ça donne

Hors ligne

 

#7 01-09-2009 12:27:23

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [1.8][Zend_Cache] Utilisation du cache de page

j'ai testé, sa marche mais je me posais une question pour éviter la mise en cache des pages où j'ai des captcha car il me laisse les anciens en cache.

Hors ligne

 

#8 01-09-2009 21:18:43

thb
Membre
Date d'inscription: 10-04-2009
Messages: 10

Re: [1.8][Zend_Cache] Utilisation du cache de page

Il ne faut pas mettre en cache les pages qui changent, comme les pages avec CAPTCHA.

Donc dans la définition du 'regexps', mettre une ligne :

Code:

...
'^/page_captcha/'    => array('cache' => false),
...

Hors ligne

 

#9 01-09-2009 21:24:45

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [1.8][Zend_Cache] Utilisation du cache de page

c'est ce que j'ai fait mais il me les met toujours en cache.

Mes paes sont tous mes articles et mon formulaire de contact

voici ma config:

Code:

$frontendOptions = array(
                'lifetime' => 7200,
                'debug_header' => false,
                'memorize_headers' => array('Content-Type',
                               'Content-Language',
                               'Content-Disposition',
                               'Content-Length',
                               'Content-Transfer-Encoding',
                               ),
        
                'default_options' => array(
                    // disable default caching for all requests
                    //'cache' => false,
                    'cache_with_cookie_variables'    => true,
                    'cache_with_session_variables'   => false,
                    'cache_with_files_variables'     => false,
                    'cache_with_get_variables'       => true,
                    'cache_with_post_variables'      => true,
                    'make_id_with_cookie_variables'  => false,
                    'make_id_with_session_variables' => true,
                    'make_id_with_files_variables'   => false,
                    'make_id_with_get_variables'     => true,
                    'make_id_with_post_variables'    => true,
        
                ),
                // cache routes to Index and News controllers
                'regexps' => array(
                    '^/$'                         => array('cache' => false),
                    '^/index/'                    => array('cache' => true),
                    '^/news/'                     => array('cache' => true),
                    '^/blog/'                     => array('cache' => true),
                    '^/blog/index/article/$'    => array('cache' => false),
                    '^/projets/'                => array('cache' => true)
                )
        );

/blog/index/article/idarticle/2

Dernière modification par throrin19 (01-09-2009 21:29:52)

Hors ligne

 

#10 02-09-2009 10:54:26

thb
Membre
Date d'inscription: 10-04-2009
Messages: 10

Re: [1.8][Zend_Cache] Utilisation du cache de page

Il faut dé-commenter le ligne :

Code:

//'cache' => false,

Donc par défaut aucune page ne sera mise en cache sauf celles définies dans le 'regexps'.

Et donc la ligne suivante devient inutile :

Code:

'^/blog/index/article/$'    => array('cache' => false),

Sinon il y a une incohérence entre ces deux lignes :

Code:

'^/$'         => array('cache' => false),
'^/index/'  => array('cache' => true),

qui à priori appellent le même contrôleur, donc il faut décider la mise cache ou non.

Si, vous n'y arrivez pas, utilisez un debugger (ou mettez des traces avec des 'echo') pour comprendre le fonctionnement du cache de Zend : notamment dans le fonction start() de Zend_Cache_Frontend_Page.

Dernière modification par thb (02-09-2009 14:44:11)

Hors ligne

 

#11 02-09-2009 11:13:55

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [1.8][Zend_Cache] Utilisation du cache de page

ah, j'avais oublier celle-ci, je vais faire tout sa merci ^^

EDIT: J'ai corrigé mais quand je met cache à false, il me met même pas celles que je veu en cache (j'ai mis le debug_header à true pour vérifier)

Dernière modification par throrin19 (02-09-2009 11:20:29)

Hors ligne

 

#12 21-09-2009 15:02:16

thb
Membre
Date d'inscription: 10-04-2009
Messages: 10

Re: [1.8][Zend_Cache] Utilisation du cache de page

Remarque :
L'utilisation des tableau $frontendOptions et $backendOptions au milieu du code du Bootstrap n'est pas très "beau".
On gagnera en lisibilité et évolutivité en mettant ces tableaux dans un fichier de configuration (ex :fichier "ini").
Puis en faisant :

Code:

$configCache = new Zend_Config_Ini(CONF_PATH . DIRECTORY_SEPARATOR . 'cache.ini', APP_MODE);

$frontendOptions = $configCache->frontendOptions->toArray();
$backendOptions = $configCache->backendOptions->toArray();

// obtenir un objet Zend_Cache_Frontend_Page
$cache = Zend_Cache::factory('Page',
                             'File',
                             $frontendOptions,
                             $backendOptions);

// lancement de la gestion du cache
$cache->start();

Zend_Registry::set('cache_page',$cache);

Dernière modification par thb (21-09-2009 15:02:54)

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