2009-04-25 5 views
9

Ich habe eine Website mit CF8 und Fusebox 5. Wenn ich der Site ein neues Feature hinzufügen muss, muss ich normalerweise circuit.xml.cfm eine neue Sicherung hinzufügen, entweder für den Controller, das Modell oder die Ansicht oder für alle . Um diese neuen Funktionen/Seiten zu ermöglichen, gehe ich auf die folgende URL:Was ist der beste Weg, um eine Fusebox App neu zu laden, ohne dass "geparste Datei oder Verzeichnis nicht gefunden" -Fehler auftreten?

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

Der letzte Parameter ist ein Ich nahm vor kurzem oben auf und festgestellt, dass es mit Hilfe würde meine neue Sicherungen ermöglichen; ohne sie werden die neuen Sicherungen nicht erkannt. Wenn ich dies tue, werden jedoch alle meine Parse-Dateien, die zuvor generiert wurden, entfernt. Dies ist kein großes Problem, da sie im laufenden Betrieb neu generiert werden, wenn sie zum ersten Mal benötigt werden, aber ich habe einige Seiten, die Fehler zurückgeben, wenn auf sie zugegriffen wird. Der Fehler besagt, dass das Verzeichnis nicht gefunden wurde, aber sie sind vorhanden. Jedes Mal, wenn dieses Problem auftritt, liegt es daran, dass die Analysedatei nicht existiert.

Hier ist ein Beispiel für einen Fehler mit dem Stack-Trace:

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) 

Was ich tue, dieses Problem zu beheben, ist die folgende URL gehen, die wie die vorherigen, aber ohne fusebox.loadclean = true :

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

Was auf den ersten url ich versuchte, war dabei nach, würde ich auf diesen zweiten gehen, aber der Fehler taucht noch auf.

Was ich suche ist die richtige Art, die Schaltungen neu zu laden, ohne diese Fehler zu erzeugen. Ich bin der dritte Entwickler, der sich auf dieser Website beteiligt. Daher hatten die vorherigen zwei verschiedene Arten, jede Instanz von circuit.xml.cfm zu konfigurieren. Diese Dateien werden verwendet, um den Anwendungsfluss zu bestimmen, was benötigt wird, zusätzliche Sicherheitsebenen und bestimmte Attribute anzugeben. Hier ist die Fusebox Methode:

<!-- 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> 

Hier ist die Mischung aus Fusebox und Coldfusion-Methode:

<!-- 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"> 

Beiden Methoden sind in der gesamten Website verwendet wird, und ich bin nicht im Gegensatz zu entweder verwenden, aber mein Ziel soll jeden Fehler reduzieren, der auftreten könnte, wenn der Benutzer versucht, auf eine bestimmte Seite zuzugreifen. Ich dachte, dass das Problem vielleicht die gemischte Methode der Konfigurationen ist, an die ich mich halten sollte, sagen wir nur die Fusebox-Methode, aber ich war nicht in der Lage, einen gemeinsamen Trend in diesem Fehler zu finden. Der Error-Handler, den wir haben, sendet mir jedes Mal eine E-Mail, wenn eine Seite einen Fehler erhält. Daher denke ich, dass ich automatisch meine zweite URL anrufen und sie zu der Seite zurückleiten könnte, die den Fehler erzeugt hat, wenn dieser spezifische Fehler auftritt das Potenzial für eine Endlosschleife, und es adressiert nicht das eigentliche Problem.

Gehe ich das falsch? Gibt es eine Reihe von Attributen, die ich in die URL aufnehmen kann und die Site dazu zwingt, neue Fuses zu erkennen, ohne meine Parse-Dateien zu löschen? CF selbst ist nicht schwer zu codieren, aber ich bin noch relativ neu dazu, also könnte ich rückwärts gehen. Vielen Dank!

Antwort

9

HINWEIS: Neue Sicherungen keine fusebox reload brauchen - nur neue fuseactions ein fordern.

Ich bin nicht ganz sicher, ob die Fehler, die Sie bekommen, sind, was ich denke, sie sind, aber das Folgende ist eine gute Praxis, egal ...

Wenn Sie Änderungen vorgenommen haben, und müssen fusebox nachladen, was sollte man dies tun:

  1. den neuesten Code Implementierung auf einen ‚Staging‘ -Bereich pre-Live auf dem gleichen Server.
    • Generieren Sie Ihre Dateien analysiert in diesem Bereich mit fusebox.parseall=true und fusebox.loadclean=true
    • Kopieren Sie alle Dateien von dort in die Live-Webroot.
    • Führen Sie eine Sicherungskasten fusebox.load=true auf der Live-Website - nichts anderes (außer Passwort).

(Hinweis: falls erforderlich, vor dem Schritt 3 Ihre Website eingestellt/Wartungsmodus offline, und dann nach dem Schritt 4 legte es wieder zurück)

+0

Genau das ist, was ich suche. Es ist eine großartige Idee, meine Parse-Dateien von meinem Staging auf die Live-Site zu verschieben. Die Änderungen, die ich an Fuseactions auf der Staging-Site mache, erfordern die Verwendung von Element 2, aber was ist, wenn ich die Änderungen auf die Live-Site hochlade? Einfach fusebox.load ausführen? – Mathachew

+0

Nach dem Hochladen der geparsten Dateien meine ich. – Mathachew

+0

Verwechseln Sie "Staging-Bereich" nicht mit "Staging-Site" (d. H. Test/UAT). Sie sollten einen Bereich * auf dem Live-Server * aber * außerhalb des Haupt-Webroot * haben, wo Sie Ihre geparsten Dateien generieren können, alle geänderten Dateien aus diesem Bereich in die Webroot kopieren, dann ist nur fusebox.load auf der Live-Site notwendig. Ihr Staging-/Test-/UAT-Server tritt nicht in diesen Prozess ein. –

0

Gibt es irgendeinen Grund nicht fusebox verwenden .mode = "development-full-load" (in fusebox.xml eingestellt)? Dies kann Ihr Leben ein bisschen einfacher machen, wenn Sie noch nicht in diesem Modus entwickeln.

+0

Da er über Benutzer, die sich mit der Website verbinden, spricht, ist er entweder live oder Test, nicht Entwicklung, sollte also Mode = "Produktion" verwenden. –