ColdFusion Application.cfc - 执行顺序

时间:2012-08-13 14:19:12

标签: coldfusion application.cfc

我需要一个现实检查 - 并希望解释(如果我的现实是错误的)。

CF应用程序框架评估事物的方式就是这个(我的理解) - 请求传递给cfserver

  • cf查找application.cfm或cfc(基于遍历规则)

  • application.cfc执行(如果找到)

  • 设置了 THIS 范围(可在此处设置一系列特定于应用程序的变量,但

一些是必需的 - 例如“applicationTimeout” - 然后发生一系列事件 - 如果需要则触发方法。

- onApplicationStart()

---- onSessionStart()

------ onRequestStart()

所以我的问题

1)THIS设置发生在每个页面请求上 - 先于其他任何内容?

2)如果我在onApplicationStart()中设置了一个应用程序变量 - 它可以在之后发生的任何进程中使用 - AND应该在内存中持续applicationTimeout()的长度 - 是否正确?

3)所以,如果我做这样的事情......

if(isdefined(“application.myvar”){         this.something = application.myvar;     }

它应该在启动应用程序范围的初始请求之后处理任何页面请求。

然而它似乎没有这样做。

我的理由是 - 有一些有趣的应用程序杠杆设置需要在此范围内设置...其中一些可能是“密集的”(至少形成执行每个请求的视角 - 所以我想只做ONCE,在持久性mem中设置一个结构,然后将它们作为这个。

我是否做了一些错误的假设?

THX

5 个答案:

答案 0 :(得分:3)

ColdFusion Application.cfc documentation有这些知识:

  

当请求执行时,ColdFusion运行CFC方法   以下顺序:

     
      
  1. onApplicationStart(如果之前没有为此应用程序运行)
  2.   
  3. onSessionStart(如果之前没有为此会话运行)
  4.   
  5. onRequestStart
  6.   
  7. onRequest / onCFCRequest
  8.   
  9. onRequestEnd
  10.         

    onApplicationEnd,onSessionEnd和onError CFC由特定事件触发。

整个请求订单(至少)还有两个步骤。

  

0:执行cfcomponent中不在cffunction中的所有代码   0.5:运行等效的cfapplication标签以创建应用程序

因此,您的问题的答案是:

  1. 如果您在步骤0中设置了这些变量,那么是。
  2. 正确。
  3. 这取决于您设置变量的位置。如果您尝试更改的值列在Application.cfc的Application variables documentation页面上,则它们必须在步骤0中。在其他地方设置它们将更新this范围,但不会生效步骤0.5。

答案 1 :(得分:3)

这里有两件事:代码运行时,可变范围可用以及它们持续多长时间。

  • 任何方法的代码(即:"伪构造函数")都会运行每个请求。显然,最大限度地减少了CFC这一部分的代码量。
  • 各种事件处理程序中的代码按事件处理程序名称指示运行,例如:onApplicationStart()代码仅在应用程序启动时运行一次。 Ditto onSessionStart()每个新会话只运行一次。

的范围:

  • 此范围可在整个CFC中使用。行为与任何其他CFC中的this-scope完全相同,除了一些这种范围的变量具有特殊含义(如this.namethis.datasource等)。这些特殊含义变量可以在相关处理程序中按会话或按请求更改,但似乎适用于整个系统(即:不适用于特定会话或请求进行设置更改)。在普通的CFC中,this范围用于公开公共变量,但由于没有Application.cfc的公共实例,除了进行这些特殊设置之外,使用this范围没有意义。如果想要让CFC中的所有方法都可以使用变量,请使用变量范围。与此处的某人建议相反,这个范围的变量与应用程序范围的变量不同。
  • 请求范围也可用于整个CFC(伪构造函数和方法)。这些也可用于请求中稍后调用的模板调用代码,与任何其他请求范围的变量一样。
  • 应用程序范围:即使在this.name设置完成后,伪构造函数中也不可用。只有在onApplicationStart()以及之后才能使用。
    • 会话范围:类似地,在伪构造函数或onApplicationStart()l中不可用,直到onSessionStart()。

我在博客文章(提供测试代码)over here中证明了这一点。它包含在这里太长了,但上面的内容总结了它。

答案 2 :(得分:1)

请查看评论,因为它会显示在下面的帖子中,但事实并非如此。如果转储此范围,则会显示新值,但实际上并未更改任何应用程序设置。

您可以随意更改任何应用程序设置;但是,因为每次请求页面时都会运行伪构造函数,所以在伪构造函数运行后需要不断更改设置。应用程序范围在伪构造函数中不可用,因此您可以在onRequestStart或onRequest函数中执行此操作。我做了一个简单的测试,根据onRequestStart函数中的条件重新分配customtagpaths。您将注意到第一次访问页面时,自定义标签文件夹将是“customtags”,其他请求将指示“someOtherCustomtagsFolder”如果您的应用程序设置按用户更改,则侧面注释您的全局应用程序设置将会翻转并可能导致其他用户设置不正确的问题。

<cfcomponent>
<!--- pseudo constructor --->
<cfset this.customtagpaths = expandPath('./customtags')>

<!--- onRequestStart --->
<cffunction name = "onRequestStart" returnType="void">
     <cfif structKeyExists(application,'testSetting')>
          <cfset this.customtagpaths = expandPath('./someOtherCustomtagsFolder')>
     </cfif>
</cffunction>

<!--- onRequest --->
<cffunction name = "onRequest" returntype="void">
     <cfargument name="targetPage" type="String" required = "true" />
     <cfdump var = "#this#" label = "this">
     <cfset application.testSetting = "foo">
     <cfinclude template="#Arguments.targetPage#">
</cffunction>
</cfcomponent>

答案 3 :(得分:-1)

Application.cfc文件中 this 范围内的任何内容都将成为应用程序变量,并且仅在每个应用程序生命周期中创建一次。应用程序启动后,Application.cfc中没有其他用户 this

第一次运行CF应用程序时,onApplicationStart()的内容在onRequest / Start / End之前运行(除了“new in CF10”onServerStart())。

应用程序中任何位置设置的任何应用程序变量都会存在,直到应用程序停止。

来自#3的代码应该只是

if ( !structKeyExists( application, "myvar" ) { application.myvar = foo; }

然后在任何需要的地方引用application.myvar。

根据您的描述,无需向范围添加任何内容,只需将其放入应用程序范围即可。

答案 4 :(得分:-2)

Application.cfc伪构造函数中没有应用程序范围,因为在设置this.name之前无法将请求绑定到应用程序。

如果您担心创建应用程序映射的开销,一种方法是将它们缓存在可用的服务器范围内。

if(!structkeyexists(server,'myappmappings')){   server.myappmappings = createMappings(); } this.mappings = server.myappmappings;

您也可以使用cachePut / cache Get将映射存储在ehcache中,但我没有在伪构造函数中尝试过。