2

CF8 から 9 への変更により、カスタム キャッシュを作成するか、努力する価値のない抜本的な回避策を講じないと、ディスクへの書き込みキャッシュができなくなりました。

現時点では、可能であれば、キャッシュ ファイルの内容を静的 cfm ファイルに書き込む同じ方法を維持するようにアプリケーションを変換する試みを断念しました。もう少し深く掘り下げたので、もっと興味があります。自分よりも経験豊富な人を探しています。

テンプレートキャッシュの使い方を理解したい、または知りたいのは次のとおりです。

  1. デフォルトまたはカスタム キャッシュ内のテンプレートをターゲットにして、キャッシュ全体をクリアせずにフラッシュできるようにします。
  2. 好奇心から、またはデバッグ アプローチのいずれかで、特定のキャッシュされたテンプレートの内容を表示または解析します。

これは私が使用していたコードで、EhCache 2.0 の追加により 9.0 では使用できないキャッシュ メモリ機能があるため、CF 9.0.1 が必要です。

<cftry>
        <cfcache action='serverCache' timeout='#CreateTimeSpan(0,0,0,10)#' stripwhitespace='true' 
                 usequerystring='true'>
            Stuff to cache.
            <br/>
            <cfoutput>#now()#</cfoutput>
            <br/>
        </cfcache>

        <!--- Get the cached contents --->
        <cfdump var="#cacheGetProperties()#">
        <cfdump var="#getAllTemplateCacheIds()#">
        <!---Locate a single cached item --->
        <cfscript>
            cacheArray = getAllTemplateCacheIds();
            WriteOutput("Before<br/>");
            for(i=1;i LTE ArrayLen(cacheArray);i=i+1)
            {
                writeOutput(cacheArray[i] & "<br/>");
                if(FindNoCase(scriptPath, cacheArray[i]))
                {
                    //expect only to find min and max one per string so no need to worry about out of bounds
                    cacheIDSubStr =  REFind("[a-fA-F\d]{32}(?=_LINE:\d*$)",cacheArray[i],1,1);
                    cacheID = Mid(cacheArray[i],CacheIDSubStr.pos[1],CacheIDSubStr.len[1]);
                   //Failure to delete cache expected fireworks
                    //WriteOutput(cacheID&"<br/>");
                    //cacheObject = CacheGet(cacheID);
                    //CacheRemove(cacheID);
                    templateCache = cacheGetSession("template");
                      //Tooling around with the exposed guts of cacheGetSession
                    WriteDump(templateCache.getKeys());
                }
            }
        </cfscript>
    <cfcatch type="Any">

        <cfscript>
            writeoutput("Error:" & cfcatch.message);
        </cfscript>

    </cfcatch>
    </cftry>

エラーは存在しないはずですが、ここに投稿するためにオリジナルから編集されました。

4

1 に答える 1

1

その秘密は CF 9.0.1 関数cacheGetSession()にあり、パラメーターとして a を受け取るように他の関数が修正keyされています。

次のコードは、9.0.1 でのみ機能します。

仮定:

<cfcache action="serverCache" timeout="#CreateTimeSpan(0,0,0,10)#" stripwhitespace="true" usequerystring="true">
Stuff to cache in the default store.
<br/>
<cfoutput>#Now()#</cfoutput>
</cfcache>

<cfcache action="serverCache" key="myCustomCache" timeout="#CreateTimeSpan(0,0,0,10)#" stripwhitespace="true" usequerystring="true">
Stuff to cache in the 'myCustomCache' store.
<cfoutput>#Now()#</cfoutput>
</cfcache>

キャッシュの識別子に個別にアクセスする

デフォルト (テンプレート):

<cfdump var=#getAllTemplateCacheIds()#>

myCustomCache:

<cfdump var=#cacheGetSession('myCustomCache',true).getKeys()#>

カスタム キャッシュのデータの読み取り

<cfset keys = cacheGetSession('myCustomCache',true).getKeys() />

<cfcache key="myCustomCache" action="get" name="dataInCache" id="#keys[1]#">

<cfdump var=#dataInCache#>

デフォルトとは別にカスタム キャッシュをフラッシュする

<cfset cacheRemove(keys[1],true,'myCustomCache')>

悲しいことに、ドキュメントは 9.0.1 でこっそり入った機能に関しては最善ではありません。幸いなことに、CF のユーザーベース、つまりCF とキャッシング全般に関する優れた記事を多数執筆しているRob-Brooks Bilsonが、この問題を掘り下げるのに長けています。

この方法でキャッシュを操作する際に覚えておくべきいくつかの注意事項:

  1. これらの呼び出しは内部で Java である EhCache に関連付けられており、存在しないキーにアクセスしようとすると NULL が返されることがあります。結果をラップしIsNull()て検証します。

  2. cacheGetSession () は誤解を招きます (Rob が彼のブログで指摘しているように)、アプリに適用されるセッション関連のキャッシュ データを取得していると思うかもしれませんが、そうではありません。共有アプリ環境で他のキャッシュのキーを参照してください。

したがって、適切なデータをフラッシュするように注意してください...

于 2012-03-21T03:24:22.787 に答える