Coldfusion应用范围

时间:2012-07-11 05:20:11

标签: coldfusion coldfusion-8

我一直在我的C​​F服务器上注意到我的应用程序开始变得非常慢。我将其中的大部分内容归结为不缓存某些内容,而实际上它们应该被缓存。

我想验证此对象是否在应用程序范围内,而不是每次加载页面时都创建它。

<cfset application.components.blog = createObject('component','sharedcomponents.cfc.blog').init()>

验证对象是否存在于Application范围内以及是否允许该对象的最佳方法是什么。此外,如果文件已更新,如何检测更改,以便整个应用程序刷新它?

任何建议都非常感谢。

2 个答案:

答案 0 :(得分:6)

您没有说明该代码的位置或执行方式/时间,因此无法自信地回答您的问题。

如果它位于Application.cfc中的onApplicationStart()中,那么 - 是的 - 它只会在应用程序启动时执行。

但是,如果它仅在某个文件中,则每次调用该文件时都会重新执行该文件,除非您采取措施确保其被调用。 EG:给它一个条件:

<cfif not (structKeyExists(application, "components") and structKeyExists(application.components, "blog"))>
    <cfset application.components.blog = createObject('component','sharedcomponents.cfc.blog').init()>
</cfif>

你似乎想知道是否有一些魔法发生在那,因为你的变量赋值在应用程序范围内设置了一些内容,如果重新执行文件,CF将自动知道不会重新运行它。不,CF就是按照它所说的做的:如果你告诉它运行那段代码,它就会运行。无论变量被分配到哪个范围。

您继续询问是否已检测文件是否已更新,并相应地重新启动整个应用程序。这些文件是如何更新的?我认为它是主动部署过程的一部分(例如:你做了一些事情来部署它们)。如果是这种情况,那么是否最适合知道应用程序何时需要重新启动?首先,并非每次代码更改都会保证应用程序重启,所以你不想自动完成,我应该想一想?

如果您需要重新启动应用,则应该有一个运行applicationStop()的脚本。有些人onRequestStart()检查了一个URL参数,然后调用applicationStop(),如果它已通过,但我个人认为这是错误的地方。对于几乎每一个条件都无关紧要的请求,所以没有必要检查每一个百万分之一的请求,它实际上是相关的。我更喜欢有一个单独的脚本来执行它,这被称为需要必须。

答案 1 :(得分:2)

您可以通过创建cfm并运行:

来转储应用程序范围以查看其中的内容

dumpApplication.cfm:

<cfdump var="#application#">

或者,如果您的应用范围很大或者其他什么,您可以专门针对它:

<cfdump var="#application.components.blog#">

现在,cfset在哪里运行?如果它在OnApplicationStart方法的Application.cfc中运行,那么是的,它只会在应用程序首次启动时运行一次并在此之后缓存。如果你经常将它设置在某个地方,那么它会一遍又一遍地发射。您可以将其更改为:

<cfif NOT structKeyExists(application.components,"blog")>
  <cflock scope="application" type="exclusive" timeout="10">
    <cfset application.components.blog ="#createObject('component','sharedcomponents.cfc.blog').init()#">
  </cflock>
</cfif>

您不必在OnApplicationStart中使用cflock,因为它是单线程的。

编辑:根据CFPARAM的评论建议