Можно ли проанализировать содержимое кеш-памяти ColdFusion 9.0.1? - PullRequest
2 голосов
/ 17 марта 2012

Я был слепым сторонником перехода с CF8 на 9, где запись в кеширование диска больше невозможна без создания пользовательского кэша или каких-то других радикальных обходных путей, которые не стоят усилий.

В настоящее время я отказался от попытки конвертировать приложение для поддержки, если возможно, того же метода записи содержимого файла кэша в статический файл cfm. Мне теперь более любопытно, что я углубился в это немного глубже. Я ищу кого-то, кто имеет больше опыта в этом, чем я.

Что я хотел бы понять или узнать, как делать с кешем шаблонов:

  1. Уметь нацеливать шаблон в кеше по умолчанию или в пользовательском кеше и очищать его, не очищая весь кеш.
  2. Просмотр или анализ содержимого определенного кэшированного шаблона из любопытства или отладки.

Это был код, с которым я работал, требует CF 9.0.1 из-за некоторых функций кеш-памяти, которые недоступны в 9.0 из-за добавления EhCache 2.0, как мне кажется.

<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 Ответ

1 голос
/ 21 марта 2012

Секрет кроется в функции CF 9.0.1 cacheGetSession(), наряду с изменением других функций, чтобы принять 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 и кешированию в целом.

Пара предостережений , которые вы должны помнить при работе с кешем следующим образом:

  1. Эти вызовы связаны с EhCache под капотом, которым является Java, и могут возвращать NULL, если вы пытаетесь получить доступ к ключам, которые не существуют. Оберните ваши результаты в IsNull() для проверки.

  2. cacheGetSession () вводит в заблуждение (как Роб указывает в своем блоге), вы можете подумать , что вы получаете данные кэша, относящиеся к сеансу, так как они применяются к вашему приложению, но это не case - это для всего сервера , и вы увидите другие ключи кеша в среде общего приложения.

Итак, позаботьтесь о сбросе соответствующих данных ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...