10

我有一个使用 CF8 和 Fusebox 5 的站点。每当我需要向站点添加新功能时,我通常必须为控制器、模型或视图或全部添加新的熔断器到 circuit.xml.cfm。要启用这些新功能/页面,我转到以下网址:

?fusebox.load=true&fusebox.parse=true&fusebox.password=password&fusebox.loadclean=true

最后一个参数是我最近发现的一个参数,并确定使用它可以启用我的新保险丝;没有它,新的保险丝将无法识别。但是,当我这样做时,我之前生成的所有解析文件都将被删除。这不是什么大问题,因为它们在第一次需要时会即时重新生成,但是我有一些页面在访问时会返回错误。错误说找不到目录,但它们在那里,每次出现都是因为解析文件不存在。

这是堆栈跟踪的一个错误示例:

Error - Parsed File or Directory not found.

Date/Time: Apr 25 2009 12:26:02

Type: fusebox.missingParsedFile

Message: Parsed File or Directory not found.

Detail:

Attempting to execute the parsed file 'login.logout.cfm' threw an error. This can occur if the parsed file does not exist in the parsed directory or if the parsed directory itself is missing.
Stack Trace:
    coldfusion.runtime.CustomException: Parsed File or Directory not found.
    at coldfusion.tagext.lang.ThrowTag.doStartTag(ThrowTag.java:124)
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
    at cffusebox52ecfm1214986498.runPage(C:\example.com\fb5core\fusebox5.cfm:216)
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192)
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366)
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
    at cfindex2ecfm584653367.runPage(C:\example.com\index.cfm:3)
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192)
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366)
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
    at cfApplication2ecfc1103573364$funcONREQUEST.runFunction(C:\example.com\Application.cfc:36)
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:418)
    at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:360)
    at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:324)
    at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:56)
    at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:277)
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:192)
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:448)
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:308)
    at coldfusion.runtime.AppEventInvoker.invoke(AppEventInvoker.java:74)
    at coldfusion.runtime.AppEventInvoker.onRequest(AppEventInvoker.java:243)
    at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:269)
    at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
    at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
    at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
    at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
    at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
    at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
    at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
    at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
    at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
    at coldfusion.CfmServlet.service(CfmServlet.java:175)
    at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
    at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
    at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
    at jrun.servlet.FilterChain.service(FilterChain.java:101)
    at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
    at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
    at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:284)
    at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
    at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
    at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
    at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
    at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

我要解决此问题的方法是转到以下 url,它与上一个类似,但没有 fusebox.loadclean=true:

?fusebox.password=password&fusebox.load=true&fusebox.parse=true

我尝试做的是在转到第一个 url 之后,我会转到第二个,但错误仍然出现。

我正在寻找的是在不产生这些错误的情况下重新加载电路的正确方法。我是参与此站点的第三位开发人员,因此前两位可能在配置每个电路.xml.cfm 实例时采用了不同的风格。这些文件用于确定需要包含的应用程序流程、附加安全层和指定某些属性。这是保险丝盒方法:

<!-- controller/circuit.xml.cfm -->
<circuit access="public">
    <fuseaction name="index">
        <set name="request.title" value="Account overview" />
        <do action="layout.header" />
        <do action="mdashboard.index" />
        <do action="vdashboard.index" />
        <do action="layout.footer" />
    </fuseaction>

    <fuseaction name="profile">
        <set name="request.title" value="Your Profile" />
        <do action="layout.header" />

        <!-- form submitted to the same page -->
        <if condition="isDefined('attributes.submit')">
            <true>
                <do action="mdashboard.updateprofile" />
                <do action="vdashboard.profile" />
            </true>
            <false>
                <do action="mdashboard.profile" />
                <do action="vdashboard.profile" />
            </false>
        </if>

        <do action="layout.footer" />
    </fuseaction>
</circuit>

<!-- model/circuit.xml.cfm -->
<circuit access="internal">
    <fuseaction name="index">
        <include template="sqlIndex" />
    </fuseaction>

    <fuseaction name="profile">
        <include template="sqlProfile" />
    </fuseaction>

    <fuseaction name="updateprofile">
        <include template="actUpdateProfile" />
    </fuseaction>
</circuit>

<!-- view/circuit.xml.cfm -->
<circuit access="internal">
    <fuseaction name="index">
        <include template="dspIndex" />
    </fuseaction>

    <fuseaction name="profile">
        <include template="dspProfile" />
    </fuseaction>
</circuit>

这是 Fusebox 和 ColdFusion 方法的混合:

<!-- controller/circuit.xml.cfm -->
<circuit access="public">
    <fuseaction name="index">
        <set name="request.title" value="Account overview" />
        <do action="layout.header" />
        <include template="ctrlIndex" />
        <do action="layout.footer" />
    </fuseaction>

    <fuseaction name="profile">
        <set name="request.title" value="Your Profile" />
        <do action="layout.header" />
        <include template="ctrlProfile" />
        <do action="layout.footer" />
    </fuseaction>
</circuit>

<!-- model/circuit.xml.cfm -->
<circuit access="internal">
</circuit>

<!-- view/circuit.xml.cfm -->
<circuit access="internal">
</circuit>

<!-- controller/ctrlProfile.cfm -->
<cfif isDefined("attributes.submit")>
    <cfinclude template="../model/actUpdateProfile.cfm">
</cfif>

<cfinclude template="../model/sqlPaymentOptions.cfm">
<cfinclude template="../view/dspPaymentOptions.cfm">

这两种方法都在整个站点中使用,我不反对使用其中任何一种,但我的目标是减少用户尝试访问特定页面时可能出现的任何错误。我在想问题可能是配置的混合方法,我应该只坚持使用 Fusebox 方法,但我无法在这个错误中找到一个共同的趋势。每次页面收到​​错误时,我们的错误处理程序都会向我发送电子邮件,所以我认为我可以自动调用我的第二个 url 并将它们重定向回在发生此特定错误时生成错误的页面,但这有无限循环的可能性,它并没有解决真正的问题。

我做错了吗?我可以在 url 中包含一组属性,这些属性将强制站点在不清除我的解析文件的情况下识别新的保险丝吗?CF 本身并不难编码,但我对它还是比较陌生,所以我可能会倒退。谢谢!

4

2 回答 2

11

注意:新保险丝不需要重新加载保险丝盒 - 只有新的保险丝操作需要一个。

我不完全确定您遇到的错误是否是我认为的错误,但是无论如何,以下都是很好的做法...

当您进行了更改并需要重新加载 fusebox时,您应该这样做:

  1. 将最新代码部署到同一服务器上的预直播“暂存”区域。
    • fusebox.parseall=true使用和在这个区域生成你的解析文件fusebox.loadclean=true
    • 将所有文件从那里复制到您的 Live webroot 中。
    • 在 Live 站点上执行一个 fusebox fusebox.load=true- 没有别的(除了密码)。

(注意:如有必要,在第 3 步之前将您的站点设置为离线/维护模式,然后在第 4 步之后将其重新上线)

于 2009-04-25T20:37:39.173 回答
0

有什么理由不使用 fusebox.mode = "development-full-load" (set in fusebox.xml) 吗?如果您还没有在这种模式下开发,这可以让您的生活更轻松。

于 2009-04-26T18:01:17.153 回答