web-dev-qa-db-fra.com

Exclure certains blocs de la mise en cache à l'aide de la mise en cache des fragments - ne fonctionne pas

J'ai un formulaire, et je l'insère dans le pied de page à partir d'un fichier de fonction. Je dois afficher un formulaire aléatoire pour chaque visiteur et avoir ainsi une fonction développée à cet effet. Cependant, avec la mise en cache activée, le caractère aléatoire ne fonctionne pas.

J'utilise W3 Total Cache Plugin pour la mise en cache.

Donc, ici, je dois exclure certaines sections de code de la mise en cache.

J'ai essayé de mettre la fonction dans Fragment Caching qui devrait faire l'affaire, mais ce n'est pas le cas.

Nous devons passer un entier aléatoire à partir d'un tableau donné et, sur cette base, il charge une forme aléatoire dans le pied de page.

Voici un extrait de code que vous pourrez consulter:

<!--MFUNC {E7C5F12EBCDA5F83A41BF33D778ED} -->
   <?php
        //echo Rand();
        $surveyforms=array("10","11");
        $ra=$surveyforms[array_Rand($surveyforms)];
        echo($ra);
    ?>
<!--/mfunc {E7C5F12EBCDA5F83A41BF33D778ED} -->

Just This devrait imprimer un nombre aléatoire à partir d'une collection de tableaux donnée chaque fois qu'une page est actualisée, mais en raison du résultat mis en cache. Si nous désactivons la mise en cache, tout fonctionne correctement. Toutefois, comme vous le savez, la mise en cache est très importante pour les performances et nous ne pouvons donc pas la désactiver.

Le même code a également été déplacé vers le footer.php mais ne fonctionne pas là non plus.

Une idée, comment utiliser la mise en cache de fragments sur un fichier de fonction? Je suis d'accord avec toute autre idée qui fonctionne.

Dans l'attente de votre réponse.

Merci

3
Krunal

De la source:

Ici ( source ) est la partie mfunc de la version 0.9.2.9 du plug-in W3TC où l'expression régulière est:

$buffer = preg_replace_callback('~<!--\s*mfunc\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->(.*)<!--\s*/mfunc\s*' . W3TC_DYNAMIC_SECURITY . '\s*-->~Uis', array(
                &$this,
                '_parse_dynamic_mfunc'
            ), $buffer);

De là, il semble que la configuration devrait être

<!-- mfunc W3TC_DYNAMIC_SECURITY code1-->
code2
<!-- /mfunc W3TC_DYNAMIC_SECURITY -->

Le callback mfunc est

function _parse_dynamic_mfunc($matches) {
    $code1 = trim($matches[1]);
    $code2 = trim($matches[2]);
    $code = ($code1 ? $code1 : $code2);

    if ($code) {
        $code = trim($code, ';') . ';';

        ob_start();
        $result = eval($code);
        $output = ob_get_contents();
        ob_end_clean();

        // ... cut ...

nous pouvons donc voir qu'il utilise eval() sur la partie code2 si la partie code1 n'est pas définie. Vérification du manuel PHP pour cette fonction:

http://php.net/manual/en/function.eval.php

ça dit:

Le code ne doit pas être encapsulé lors de l'ouverture et de la fermeture des balises PHP

Exemples:

Donc, je penserais qu'un exemple de travail, où vous avez

define('W3TC_DYNAMIC_SECURITY', 'E7C5F12EBCDA5F83A41BF33D778ED' ); 

ressemblerait à ceci (non testé):

Le cas code1:

<!-- mfunc E7C5F12EBCDA5F83A41BF33D778ED         
    echo "From code1: Here is a random number " . Rand(0,1000);
-->
<!--/mfunc E7C5F12EBCDA5F83A41BF33D778ED -->

ou le cas code2:

<!-- mfunc E7C5F12EBCDA5F83A41BF33D778ED -->
    echo "From code2: Here is a random number " . Rand(0,1000);
<!--/mfunc E7C5F12EBCDA5F83A41BF33D778ED -->
2
birgire