ColdFusion 服务器 CFC 缓存问题

12

我在我的笔记本电脑上使用自己带有ColdFusion 8服务器和运行在Windows Vista上的IIS进行ColdFusion应用程序开发。我遇到了一个相当烦人的问题。

问题是每当我对我的CFC(ColdFusion组件)进行任何更改时,似乎除非我重新启动ColdFusion应用程序服务器,否则对我的CFC的更改不会生效。经常情况下,我不得不重启整个机器,因为Windows无法重新启动ColdFusion应用程序服务器服务。是否有更好的方法来重置ColdFusion服务器的CFC缓存?

这开始占据了很多时间,每次更改后都必须重新启动。非常感谢任何见解!

谢谢!


他们是否在您的应用程序范围内?另外,在服务器设置>缓存下,您是否选中了“保存类文件”? - kevink
请检查管理员 > 数据和服务 > Web服务,看看cfcs是否正在注册自己作为Web服务,如果是,请从该屏幕中删除它们,然后查看是否有所帮助。 - kevink
它们中没有一个被注册为Web服务。然而,我正在将一些我的CFC保存到应用程序和会话范围。我该怎么办才能解决这个问题? - GavinWoods
我现在无法测试,但请尝试创建一个只有一行代码的小型cfm文件<cfset OnApplicationStart()>然后查看是否可以重新加载它们,如果可以的话,我将把这个方法移入答案中。 - kevink
这应该会有所帮助:https://dev59.com/Q3A75IYBdhLWcg3wxcDV - ale
显示剩余3条评论
8个回答

10

我保证你在一些持久范围内(比如应用程序、会话范围)创建了这些对象。为了避免这个问题,在开发过程中,我通常会创建一个URL参数,并在application.cfm/cfc文件(或者你正在创建对象的任何其他地方)中检查该参数,如果检测到该URL参数,则重新创建对象。

示例:

<cfif NOT structKeyExists(application,"myObj") OR structKeyExists(url,"reinit")>
    <cfset application.myObj = createObject("component","path.to.cfc") />
</cfif>

当然,你需要针对每个出现问题的对象进行这样的操作。


这个问题困扰了我很长时间。我没有意识到将某些东西放在应用程序范围内实际上可以保存代码。我以为它只会保存对象的元数据。谢谢! - Kip

1

我不确定其他版本的CF是否也存在此功能,但在CF9中,您可以使用ApplicationStop()函数来重置CFApplication并重新加载它。


这正是我需要的!但是我正在运行CF8。该版本不支持它 :( - GavinWoods

1

CFAdmin中取消“组件缓存”-->缓存

还要检查CFAdmin -->映射,确保CFC文件夹指向正确的文件夹(如果有)。有时人们会克隆源代码,但不更改映射到新文件夹。


0
如果你在开发中必须使用缓存,你可以像我一样做:
首先,在你的onRequest()方法的顶部添加一个检查URL标志的代码,该代码将调用onApplicationStart()方法:
<cfif IsDefined("URL.dev")>
    <cflock timeout="5" scope="Session" type="Exclusive">
        <cfif URL.dev EQ true>
            <cfset SESSION.debug = true />
        <cfelse>
            <cfset StructDelete(SESSION, "debug") />
        </cfif> 
    </cflock>
</cfif>

<cflock timeout="5" scope="Session" type="Readonly">
    <cfif IsDefined("URL.appreset") or IsDefined("SESSION.dev")>
            <cfset StructClear(SESSION) />
            <cfset onApplicationStart() />
        </cfif>
</cflock>   

这将解决大部分问题。但是,如果您在加载的类中遇到问题,它将无法检查此标志。我用的解决方案是:
在您的onError()方法底部添加以下内容:
<cfif IsDefined("APPLICATION")>
      <cfset StructClear(APPLICATION) />
</cfif>

最后,您需要检查APPLICATION对象是否存在以及作为APPLICATION范围的一部分声明的每个类是否存在,或者您想要重新调用onApplicationStart()。为此,请在onRequestStart()顶部的第一个代码块正下方添加以下内容:
<cfif not IsDefined("APPLICATION")
    OR not StructKeyExists(APPLICATION, "[ClassName1]")
    OR not StructKeyExists(APPLICATION, "[ClassName2]")
    ...>
    <cfset onApplicationStart() />
</cfif>

0
在您的 Coldfusion 管理员中,您是否启用了以下任一选项(已选中)?
缓存 > 可信缓存
缓存 > 保存类文件

0
只是问一个显而易见的问题: 你是从 onApplicationStart 调用这些函数吗?

不,这些函数不是在 onApplicationStart 上调用的。 - GavinWoods

0
也许可以尝试在CF管理界面下的缓存中点击“清除模板缓存”按钮。
我之前也遇到过这种情况。通常我需要多次点击该按钮,才能使CF注册更改后的文件。
还可以尝试取消缓存下的所有选项。注意:仅适用于开发机器!

谢谢您的回复。我尝试了,但没有成功。这在过去通常只对我的 .cfm 文件有效。我还尝试启用和禁用缓存选项,但仍然无法解决 :(。听起来好像我将不得不经常重新启动 CF 应用程序服务器,直到我的公司决定升级到 CF9 或更高版本为止,这将是一个持续的烦恼。 - GavinWoods

0

我曾经遇到过完全相同的问题,有时候在启动服务器服务管理器后更改不会反映出来,我不得不重新启动机器。

我的解决方法是,在(管理员,缓存)中: 1. 我取消了所有缓存选项 2. 我将文本框的值设置为“0” 3. 在开发时,我保持(管理员,缓存)页面打开,这样当我上传更改并且它没有反映出来时,我只需点击“立即清除模板缓存”。

这是我在CF8、内置Web服务器、XP上的解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接