4

我们已将 ColdFusion 应用程序从 ColdFusion 10 迁移到 ColdFusion 2016。迁移后,应用程序变量不再停留在其范围内,而是在每次请求时都在刷新。

考虑以下示例,

应用程序.cfm

<cfsetting enablecfoutputonly="true" />

<CFAPPLICATION  NAME="Test App"
                SETCLIENTCOOKIES="YES"
                CLIENTMANAGEMENT="YES"
                SESSIONMANAGEMENT="YES"
                SESSIONTIMEOUT="#CREATETIMESPAN(0,8,0,0)#"                                   
                APPLICATIONTIMEOUT="#CREATETIMESPAN(1,0,0,0)#">

<cfdump var="#Application#" label="app">

<CFLOCK SCOPE="APPLICATION" TYPE="EXCLUSIVE" TIMEOUT="10">
    <CFSET Application.Email = "test@test.com">
    <CFSET Application.DataSource="test">
</cflock>

测试.cfm

<CFLOCK SCOPE="APPLICATION" TYPE="READONLY" TIMEOUT="10">
    <cfset Application.one = 1>
    <cfset Application.two = 2>
    <cfset Application.three = 3>
</cflock>

OnRequestEnd.cfm

<cfsetting showdebugoutput="false" />
<cfdump var="#Application#" label="onRequestEnd">

所以如果我们请求 /test.cfm 它会抛出以下输出 在此处输入图像描述

再次刷新页面也给出相同的输出 在此处输入图像描述

不知道为什么应用程序范围的变量正在失去它的持久性。

以下是预期的输出..

在此处输入图像描述

知道为什么应用程序变量会丢失并在每个请求中刷新吗?

4

1 回答 1

2

我没有测试过这段代码,但你看到的是Application.cfm. 您实际上是在针对每个请求重新定义应用程序,这就是为什么名称存在于您的初始转储中而其余的存在于转储中的onRequestEnd.

如果您将代码更新为 use Application.cfc,您可以放弃cflock代码,更好地组织您的“触发器”并在需要时使用onApplicationStart.

<cfcomponent>

    <cfset this.name = "Test App">
    <cfset this.SETCLIENTCOOKIES="YES">
    <cfset this.CLIENTMANAGEMENT="YES">
    <cfset this.SESSIONMANAGEMENT="YES">
    <cfset this.SESSIONTIMEOUT="#CREATETIMESPAN(0,8,0,0)#">
    <cfset this.APPLICATIONTIMEOUT="#CREATETIMESPAN(1,0,0,0)#">
    <cfsetting enablecfoutputonly="true" />

    <cffunction name="onApplicationStart" access="public" returnType="void" output="false">
        <cfset application.Email = "test@test.com">
        <cfset application.DataSource="test">
    </cffunction>

    <cffunction name="onRequestStart" access="public" returntype="boolean" output="false">

        <cfset application.one = 1>
        <cfset application.two = 2>
        <cfset application.three = 3>

        <cfreturn true>
    </cffunction>

    <cffunction name="onRequestEnd" access="public" returntype="boolean" output="false">

        <cfsetting showdebugoutput="false" />
        <cfdump var="#application#" label="onRequestEnd">

        <cfreturn true>
    </cffunction>

</cfcomponent>

这应该在应用程序第一次加载时在应用程序范围内定义email一次datasource。变量one,twothree将在每个请求开始时创建,但您可以添加检查以仅在它们不存在时设置它们。

然后,您可以使用子Application.cfc文件来帮助使用子文件夹和子应用程序特定变量模块化您的应用程序。它们仍将存在于较大应用程序的范围内,但您可以通过这种方式从特定于子应用程序的位置管理它们。

于 2019-04-03T15:34:37.497 回答