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
Die ColdFusion Application.cfc-Dokumentation hat diesen Leckerbissen:
Wenn eine Anfrage ausgeführt wird, führt ColdFusion die CFC-Methoden in der folgende Reihenfolge:
- onApplicationStart (falls nicht vorher für diese Anwendung ausgeführt)
- onSessionStart (falls nicht vorher für diese Sitzung ausgeführt)
- onRequestStart
- onRequest / onCFCRequest
- onRequestEnd
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
auscfcomponent
aus, der nicht incffunction
ist 0.5: Führen Sie das Äquivalent zumcfapplication
-Tag zum Erstellen der Anwendung
Als solche lauten die Antworten auf Ihre Fragen:
this
-Bereich aktualisiert, in Schritt 0.5 jedoch nicht wirksam. Hier gibt es zwei Dinge: wann Code ausgeführt wird und wann variable Bereiche verfügbar sind und wie lange sie dauern.
Bereiche:
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. this.name
vorgenommen wurde. Wird erst in onApplicationStart () und danach von dort verfügbar.
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.
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%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.
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.
Tags und Links coldfusion application.cfc