web-dev-qa-db-ja.com

フラグメントキャッシュを使用してキャッシュから特定のブロックを除外 - 機能しません

私は1つのフォームを持っていて、そしてそれを関数ファイルからページフッターに挿入しています。各訪問者にランダムなフォームを表示する必要があるため、これをサポートするために開発された機能があります。ただし、キャッシュを有効にした場合、ランダム性は機能しません。

キャッシングにはW3 Total Cache Pluginを使用しています。

だからここで、私はキャッシングからコードの特定のセクションを除外する必要があります。

私はその機能をFragment Cachingの中に入れようとしましたが、それはうまくいきません。

与えられた配列からランダムな整数を渡す必要があり、それに基づいてフッターにランダムな形式をロードします。

確認するコードスニペットは次のとおりです。

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

Just Thisはページが更新されるたびに与えられた配列コレクションから乱数をプリントするべきですが、結果をキャッシュするためです。キャッシュを無効にした場合、キャッシュはパフォーマンス上非常に重要であるため、キャッシュを無効にすることはできません。

同じコードがfooter.phpにも移動しましたが、そこでも動作しません。

何かアイデア、関数ファイルでフラグメントキャッシュを使用する方法?私はうまくいく他のどんなアイデアでも大丈夫です。

あなたの回答を楽しみにしています。

ありがとう

3
Krunal

ソースから:

ここで( source )は0.9.2.9バージョンのW3TCプラグインのmfunc部分で、正規表現は次のとおりです。

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

これより、セットアップは次のようになります。

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

mfuncコールバックは

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

そのため、code2部分が設定されていない場合、code1部分でeval()が使用されていることがわかります。この関数のPHPマニュアルを確認します。

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

それは言います:

コードを開始および終了PHPタグで囲まないでください。

例:

だから私はあなたが持っている実用的な例、と思うだろう

define('W3TC_DYNAMIC_SECURITY', 'E7C5F12EBCDA5F83A41BF33D778ED' ); 

このようになります(未テスト)。

code1の場合:

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

またはcode2の場合:

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