2012-03-16 9 views
2

CF8から9への変更により、ディスクキャッシュへの書き込みがカスタムキャッシュや他の劇的な回避策を作成しなくてもできなくなってしまったことは盲目でした。ColdFusion 9.0.1キャッシュメモリの内容を解析することはできますか?

現時点では、キャッシュファイルの内容を静的な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> 

エラーはありませんが、オリジナルから編集してここに投稿してください。

答えて

1

秘密は、keyをパラメータとする他の機能の修正と共に、CF 9.0.1機能cacheGetSession()にあります。

次のコードは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 cacheRemove(keys[1],true,'myCustomCache')> 

のカスタムキャッシュをフラッシュするカスタムキャッシュ

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

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

<cfdump var=#dataInCache#> 

のデータを読み込み

は、ドキュメントはその機能に関してその最高の状態ではなく、 9.0.1で忍び寄る。幸いなことに、CFのユーザ基盤は、このようなことを掘り起こすのには威力を発揮しています。すなわち、Rob-Brooks Bilsonは、CFや一般的なキャッシングに関する素晴らしい記事を多数持っています。あなたはこの方法でキャッシュでの作業に覚えておく必要があります警告の

カップル

  1. これらの呼び出しは、Javaでボンネットの下にehcacheにネクタイ、そしてあなたがアクセスしようとした場合にNULLを返すことがあります。存在しないキー。検証するために結果をIsNull()にラップします。

  2. cacheGetSession()(ロブは、彼のブログで指摘するように)誤解されて、あなたはそれはあなたのアプリケーションに適用されるセッション関連のキャッシュデータを取得していると思うかもしれないが、それはそうではありません - それはありますサーバー全体にと表示され、共有アプリケーション環境に他のキャッシュのキーが表示されます。

だから、...

適切なデータ フラッシュに世話をします
関連する問題