2012-07-11 162 views
1

我一直在注意到我的CF服務器上我的應用程序開始變得很慢。我將這些歸因於不緩存某些內容,而實際上它們應該被緩存。Coldfusion應用程序範圍

我想驗證此對象是否在應用程序範圍內,並且不會在每次加載頁面時都創建它。

<cfset application.components.blog = createObject('component','sharedcomponents.cfc.blog').init()> 

什麼是覈實,如果該對象的應用範圍存在,如果它是讓它去的最佳途徑。此外,如果文件已更新,如何檢測更改以便整個應用程序刷新它?

任何建議非常感謝。

回答

6

你不會說代碼是在哪裏或者是如何/何時執行,所以不可能自信地回答你的問題。

如果它在Application.cfc中的onApplicationStart()中,那麼 - 是的 - 它只會在應用程序啓動時執行。

但是,如果它只是在某個文件中,每次調用該文件時都會重新執行,除非您採取措施確保調用而不是。 EG:把條件周圍:

<cfif not (structKeyExists(application, "components") and structKeyExists(application.components, "blog"))> 
    <cfset application.components.blog = createObject('component','sharedcomponents.cfc.blog').init()> 
</cfif> 

你好像如果一些魔術發生在因爲你的變量賦值設定一些在應用範圍是CF會自動知道,如果該文件不重新運行它想知道它的在重新執行。不,CF只是按照它所告訴的:如果你告訴它運行該代碼,它將被運行。不管變量分配的範圍如何。

您繼續詢問有關檢測文件是否已更新並相應地重新啓動整個應用程序。這些文件如何更新?我認爲它是活動部署過程的一部分(例如:你需要做一些部署)。如果是這樣的話,是不是處於最佳位置知道應用何時需要重啓?首先,並非每個代碼更改都會保證應用程序重新啓動,所以您不想自動執行這些操作,我應該這樣想?

如果您需要重新啓動應用程序,您應該有一個運行applicationStop()的腳本。有些人的onRequestStart()檢查URL參數,如果它通過,則會調用applicationStop(),但我個人認爲這是錯誤的地方。對於幾乎所有的條件都不相關的請求,所以沒有必要檢查它對每一百萬次事件的請求,因爲它實際上是相關的。我更喜歡有一個單獨的腳本來完成它,這被稱爲需求必須。

+1

我覺得CFIF的第二部分應讀「而不是structKeyExists(application.components,‘博客’)」我試圖編輯代碼,但StackOverflow上有一個愚蠢的生意規則編輯需要6個「非空間」字符或更多。 – 2012-07-11 12:02:18

+1

@Scott:整個事情都是在'NOT',配偶。除非我錯過了一些東西,這就是我們想要的。如果'application.components.blog'不存在,那麼設置它。否則繼續前進。 – 2012-07-11 13:41:22

+0

Ack ....所以這是....愚蠢的老眼睛和括號...... – 2012-07-11 14:55:38

2

你可以轉儲的應用範圍,看看有什麼在它通過創建一個CFM和運行:

dumpApplication.cfm:

<cfdump var="#application#"> 

或者,如果你的應用範圍巨大或者有東西,你可以具體目標如下:

<cfdump var="#application.components.blog#"> 

現在,cfset在哪裏運行?如果它在OnApplicationStart方法中的Application.cfc中運行,那麼是的,它只會在應用程序第一次啓動並在此之後進行緩存時運行一次。如果你經常把它放在某個地方,那麼它會一遍又一遍地開火。您可以將其更改爲:

<cfif NOT structKeyExists(application.components,"blog")> 
    <cflock scope="application" type="exclusive" timeout="10"> 
    <cfset application.components.blog ="#createObject('component','sharedcomponents.cfc.blog').init()#"> 
    </cflock> 
</cfif> 

您不必在OnApplicationStart中使用cflock,因爲它是單線程的。

編輯:根據評論意見對CFPARAM

+4

我會猶豫使用''這個。 「default」屬性值中的表達式總是被執行,無論變量是否存在。所以即使它被丟棄,你也會招致createObject()/方法調用的開銷。這正是OP希望避免的,因此我使用''構造來確定是否運行代碼。 – 2012-07-11 07:33:27

+0

好提醒亞當 - 我看到很多。 – 2012-07-11 13:11:53

+0

謝謝你們! :) – BKK 2012-07-11 19:00:16

相關問題