1

我一直在我的 CF 服务器上注意到我的应用程序开始变得很慢。我将其中的大部分归因于不缓存某些东西,而实际上它们应该被缓存。

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

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

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

任何建议都非常感谢。

4

2 回答 2

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()如果它通过了,就会调用它,但我个人认为这是错误的地方。对于几乎每个请求,该条件都是无关紧要的,因此没有必要在百万分之一的情况下检查每个请求是否真正相关。我更喜欢有一个单独的脚本来做这件事,这被称为需要。

于 2012-07-11T06:09:53.693 回答
2

您可以通过创建 cfm 并运行来转储应用程序范围以查看其中的内容:

转储应用程序.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 的评论建议

于 2012-07-11T06:10:38.783 回答