it-swarm.com.de

Bestimmten Block mit Fragment Caching vom Caching ausschließen - funktioniert nicht

Ich habe ein Formular, und ich füge es in der Fußzeile einer Funktionsdatei ein. Ich muss jedem Besucher ein zufälliges Formular anzeigen und daher eine Funktion entwickeln, die dies unterstützt. Bei aktiviertem Caching funktioniert die Zufälligkeit jedoch nicht.

Ich verwende das W3 Total Cache Plugin zum Cachen.

Hier muss ich also einen bestimmten Codeabschnitt vom Caching ausschließen.

Ich habe versucht, die Funktion in Fragment Caching zu integrieren, die den Trick ausführen sollte, aber das ist nicht der Fall.

Wir müssen eine zufällige Ganzzahl aus einem gegebenen Array übergeben und basierend darauf wird eine zufällige Form in die Fußzeile geladen.

Hier ist ein Codeausschnitt, den Sie überprüfen können:

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

Nur dies sollte eine Zufallszahl aus einer Array-Sammlung ausgeben, die jedes Mal angegeben wird, wenn eine Seite aktualisiert wird, jedoch aufgrund des Caches des Ergebnisses. Wenn wir das Zwischenspeichern deaktivieren, funktioniert es einwandfrei. Wie Sie jedoch wissen, ist das Zwischenspeichern für die Leistung sehr wichtig, sodass wir es nicht deaktivieren können.

Derselbe Code wurde auch in die footer.php verschoben, funktioniert dort aber nicht.

Irgendeine Idee, wie man Fragment-Caching für Funktionsdateien verwendet? Mir geht es gut mit jeder anderen Idee, die funktioniert.

Ich freue mich auf Ihre Antwort.

Vielen Dank

3
Krunal

Aus der Quelle:

Hier ( source ) ist der Teil mfunc in der 0.9.2.9-Version des W3TC-Plugins, in dem der reguläre Ausdruck lautet:

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

Daraus ergibt sich, wie das Setup sein sollte

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

Der Rückruf für mfunc lautet

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 ...

so können wir sehen, dass eval() für den code2-Teil verwendet wird, wenn der code1-Teil nicht festgelegt ist. Überprüfen Sie das PHP Handbuch für diese Funktion:

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

es sagt:

Der Code darf nicht in öffnende und schließende PHP Tags eingeschlossen werden

Beispiele:

Also ich würde das für ein Arbeitsbeispiel halten, wo du hast

define('W3TC_DYNAMIC_SECURITY', 'E7C5F12EBCDA5F83A41BF33D778ED' ); 

würde so aussehen (ungetestet):

Der code1 Fall:

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

oder der code2 fall:

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