2012-07-11 100 views
1

我一直在注意到我的CF服务器上我的应用程序开始变得很慢。我将这些归因于不缓存某些内容,而实际上它们应该被缓存。Coldfusion应用程序范围

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

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

什么是核实,如果该对象的应用范围存在,如果它是让它去的最佳途径。此外,如果文件已更新,如何检测更改以便整个应用程序刷新它?

任何建议非常感谢。

回答

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

我觉得CFIF的第二部分应读“而不是structKeyExists(application.components,‘博客’)”我试图编辑代码,但StackOverflow上有一个愚蠢的生意规则编辑需要6个“非空间”字符或更多。 – 2012-07-11 12:02:18

+1

@Scott:整个事情都是在'NOT',配偶。除非我错过了一些东西,这就是我们想要的。如果'application.components.blog'不存在,那么设置它。否则继续前进。 – 2012-07-11 13:41:22

+0

Ack ....所以这是....愚蠢的老眼睛和括号...... – 2012-07-11 14:55:38

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

+4

我会犹豫使用''这个。 “default”属性值中的表达式总是被执行,无论变量是否存在。所以即使它被丢弃,你也会招致createObject()/方法调用的开销。这正是OP希望避免的,因此我使用''构造来确定是否运行代码。 – 2012-07-11 07:33:27

+0

好提醒亚当 - 我看到很多。 – 2012-07-11 13:11:53

+0

谢谢你们! :) – BKK 2012-07-11 19:00:16