ColdFusion Application.cfc - Reihenfolge der Ausführung

8

Ich brauche einen Realitätscheck - und hoffentlich eine Erklärung (wenn meine Realität falsch ist).

Die Art, wie das CF-Anwendungs-Framework die Dinge bewertet, ist dies (mein Verständnis) - Anfrage wird an cfserver übergeben

  • cf findet eine application.cfm oder cfc (basierend auf Traversierungsregeln)

  • application.cfc wird ausgeführt (falls gefunden)

  • Der THIS Bereich ist festgelegt (eine Reihe anwendungsspezifischer vars kann hier festgelegt werden, aber

einige sind erforderlich - wie "applicationTimeout" - dann findet eine Reihe von Ereignissen statt - und Methoden werden bei Bedarf ausgelöst.

- onApplicationStart ()

---- onSessionStart ()

------ onRequestStart ()

usw.

so meine Fragen

1) Die Einstellungen für DIESE erfolgen bei jeder Seitenanfrage - vor allem anderen?

2) Wenn ich eine Anwendungsvariable in onApplicationStart () festlege - sie ist in jedem Prozess verfügbar, der danach passiert - UND sollte im Speicher für die Länge von applicationTimeout () bleiben - richtig?

3) wenn ich so etwas mache ...

if (ist definiert ("application.myvar") {         this.something = Anwendung.myvar;     }

Es sollte bei jeder Seitenanforderung nach der ersten Anfrage, die den Anwendungsumfang gestartet hat, funktionieren.

scheint es aber nicht zu tun.

Mein Grund zu fragen ist dies - es gibt einige interessante Einstellungen für den Anwendungshebel, die im THIS-Bereich eingestellt werden müssen ... einige von ihnen könnten "intensiv" sein (zumindest aus Sicht der Ausführung bei jeder Anfrage) - also möchte ich sie nur EINMAL machen, eine Struktur in persistent mem setzen und dann diese als THIS verfügbar machen.

Mache ich falsche Annahmen?

thx

    
jpmyob 13.08.2012, 14:19
quelle

5 Antworten

3

Die ColdFusion Application.cfc-Dokumentation hat diesen Leckerbissen:

  

Wenn eine Anfrage ausgeführt wird, führt ColdFusion die CFC-Methoden in der   folgende Reihenfolge:

     
  1. onApplicationStart (falls nicht vorher für diese Anwendung ausgeführt)
  2.   
  3. onSessionStart (falls nicht vorher für diese Sitzung ausgeführt)
  4.   
  5. onRequestStart
  6.   
  7. onRequest / onCFCRequest
  8.   
  9. onRequestEnd
  10.   

Die onApplicationEnd-, onSessionEnd- und onError-CFCs werden von bestimmten Ereignissen ausgelöst.

Der Gesamtauftragsauftrag hat (mindestens) zwei weitere Schritte.

  

0: Führe den gesamten Code in cfcomponent aus, der nicht in cffunction ist   0.5: Führen Sie das Äquivalent zum cfapplication -Tag zum Erstellen der Anwendung

aus

Als solche lauten die Antworten auf Ihre Fragen:

  1. Wenn Sie diese Variablen in Schritt 0 setzen, dann yes.
  2. Richtig.
  3. Das hängt davon ab, wo Sie die Variable setzen. Wenn die Werte, die Sie ändern möchten, in der Anwendungsvariablen aufgeführt sind Seite für Application.cfc müssen sie in Schritt 0 sein. Wenn Sie sie an anderer Stelle einstellen, wird der this -Bereich aktualisiert, in Schritt 0.5 jedoch nicht wirksam.
nosilleg 14.08.2012 09:21
quelle
2

Hier gibt es zwei Dinge: wann Code ausgeführt wird und wann variable Bereiche verfügbar sind und wie lange sie dauern.

  • Der Code außerhalb jeder Methode (dh der "Pseudokonstruktor") führt jede Anfrage aus. Offensichtlich minimieren Sie die Menge an Code in diesem Teil des CFC.
  • Der Code in verschiedenen Ereignisprozeduren wird wie vom Namen des Ereignishandlers angezeigt ausgeführt, z. B .: onApplicationStart () - Code wird nur einmal ausgeführt, wenn die Anwendung gestartet wird. Ditto onSessionStart () wird nur einmal pro neue Sitzung ausgeführt.

Bereiche:

  • Dieser Bereich ist im gesamten CFC verfügbar. Benimmt sich genau wie der this-scope in jedem anderen CFC, außer dass einige dieser Bereichsvariablen eine besondere Bedeutung haben (wie this.name , this.datasource , etc). Diese Variablen mit besonderer Bedeutung können pro Sitzung oder pro Anfrage in den entsprechenden Handlern geändert werden, scheinen aber für das gesamte System zu gelten (dh nicht für die spezifische Sitzung oder Anfrage, bei der die Einstellung geändert wird). In normalen CFCs wird der Bereich this verwendet, um öffentliche Variablen verfügbar zu machen. Da es jedoch keine öffentliche Instanz von Application.cfc gibt, ist es nicht sinnvoll, den Bereich this zusätzlich zu diesen speziellen Einstellungen zu verwenden. Wenn Variablen für alle Methoden innerhalb des CFC verfügbar sein sollen, verwenden Sie den Variablenbereich wie normalerweise. Im Gegensatz zu dem Ratschlag von jemandem, sind diese Variablen mit Gültigkeitsbereich NICHT mit anwendungsspezifischen Variablen identisch.
  • Der Anforderungsbereich ist auch im gesamten CFC verfügbar (Pseudo-Konstruktor und Methoden). Diese stehen auch dem aufrufenden Code von Vorlagen zur Verfügung, die später in der Anfrage aufgerufen werden, wie alle anderen auf Anfrage festgelegten Variablen.
  • Anwendungsumfang: Nicht im Pseudo-Konstruktor verfügbar, selbst nachdem die Einstellung this.name vorgenommen wurde. Wird erst in onApplicationStart () und danach von dort verfügbar.
    • Sitzungsumfang: in ähnlicher Weise nicht im Pseudo-Konstruktor oder onApplicationStart () l verfügbar und nicht bis onSessionStart ().

Ich habe dies in einem Blogpost (Testcode bereitgestellt) demonstriert, hier drüben . es ist zu langwierig, um es hier einzubeziehen, aber die obigen Sachen fassen es zusammen.

    
Adam Cameron 15.08.2012 23:08
quelle
1

Bitte sehen Sie sich die Kommentare an, wie es aussieht, der folgende Post funktioniert, tut es aber nicht. Wenn Sie den Bereich scope ablegen, wird Ihr neuer Wert angezeigt, ändert jedoch keine Anwendungseinstellungen.

Sie können die Anwendungseinstellungen beliebig ändern. Da der Pseudokonstruktor jedoch jedes Mal ausgeführt wird, wenn eine Seite angefordert wird, müssen Sie die Einstellung nach der Ausführung des Pseudokonstruktors ständig ändern. Der Anwendungsumfang ist im Pseudokonstruktor nicht verfügbar. Sie können dies in der Funktion onRequestStart oder onRequest tun. Ich habe einen einfachen Test gemacht, der die customtagpaths für eine Bedingung in der onRequestStart Funktion neu zuweist. Sie werden feststellen, dass beim ersten Zugriff auf die Seite der benutzerdefinierte Tag-Ordner "customtags" sein wird. Bei zusätzlichen Anfragen wird "someOtherCustomtagsFolder" angezeigt. Wenn sich Ihre Anwendungseinstellungen pro Benutzer ändern, werden Ihre globalen Anwendungseinstellungen flip-flop und könnte dazu führen, dass andere Benutzer falsche Einstellungen erhalten.

%Vor%     
Travis 14.08.2012 11:50
quelle
-1

Alles, was sich im Bereich this in einer Application.cfc-Datei befindet, wird zu einer Anwendungsvariable und wird nur einmal pro Anwendungslebenszyklus erstellt. Nach dem Start der Anwendung gibt es keinen anderen Benutzer für dies in Application.cfc.

Wenn eine CF-Anwendung zum ersten Mal ausgeführt wird, wird der Inhalt von onApplicationStart () vor onRequest / Start / End ausgeführt (mit Ausnahme von "new in CF10" onServerStart ()).

Alle Anwendungsvariablen, die an einer beliebigen Stelle in der Anwendung festgelegt sind, sind vorhanden, bis die Anwendung beendet wird.

Ihr Code von # 3 sollte nur

sein

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

referenzieren Sie application.myvar dort, wo Sie es brauchen.

Aus Ihrer Beschreibung muss dem Bereich this nichts hinzugefügt werden, es muss lediglich in den Anwendungsbereich der Anwendung aufgenommen werden.

    
Adrian J. Moreno 13.08.2012 15:08
quelle
-2

Der Anwendungsumfang ist im Pseudokonstruktor Application.cfc nicht verfügbar, da bis zur Festlegung dieses Namens keine Möglichkeit besteht, die Anforderung an die Anwendung zu binden.

Wenn Sie sich Sorgen um den Aufwand beim Erstellen Ihrer Apps-Mappings machen, besteht ein Ansatz darin, sie im verfügbaren Server-Bereich zwischenzuspeichern.

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

Sie können möglicherweise auch cachePut / cache Get verwenden, um die Mappings in ehcache zu speichern, aber ich habe das im Pseudo-Konstruktor nicht versucht.

    
Chris Blackwell 13.08.2012 17:46
quelle

Tags und Links