1

我很想知道在使用multfusionver安裝coldfusion9時,是否跨服務器實例重新存儲會話範圍中存儲的數組。 2個集羣實例在啓用會話複製的同一臺計算機上運行。Coldfusion多服務器集羣會話複製 - 在sessionscope中的陣列

我不知道如果我理解正確的文檔:

http://help.adobe.com/en_US/ColdFusion/9.0/Admin/WSc3ff6d0ea77859461172e0811cbf363c31-7ffa.html

它說:

會話複製還確​​保了會話範圍變量跨羣集複製。但是,會話複製不支持在會話範圍CFC或變量中複製數組。

所以,如果我有例如存儲該購物車中被稱爲「車」的會話變量,其是結構(具有數量和項目ID)的陣列的購物系統,這將不被複制翻過集羣成員實例?

回答

1

如果購物車本身就是一個CFC:

<cfset session.cart = CreateObject('component','model.objects.shoppingCart') /> 

如果它在內部封裝結構的陣列,並將它們存儲在SESSION或變量,它是行不通的。在任何其他情況下,它將爲 - 但在ACF9.0多服務器羣集中實施時不適用。

解決的辦法是重新設計的CFC /類爲您的商店,使他們:

  1. 內部(在CFC內),不要使用變量的作用域存儲訪問數組和

  2. 在內部(在CFC內),當讀/寫數組時,不要直接訪問SESSION範圍。

你這樣做使用,而不是一個數組結構(以下爲您的購物車CFC中定義的方法):

<cffunction name="addItemToCart" returntype="void"> 
    <cfargument name="item" type="any" required="true" /> 

    <cfscript> 
    var id = arguments.item.getID(); 
    if (NOT StructKeyExists(VARIABLES.userCart, 'id') 
    { 
    VARIABLES.userCart[id] = StructNew(); 
    VARIABLES.userCart[id].qty = 0; 
    } 
    VARIABLES.userCart[id].item = arguments.item; 
    VARIABLES.userCart[id].qty++; 
    </cfscript> 

在這上面的僞代碼,變量例如.userCart是在CFC範圍內可訪問的範圍(並且在CFC生命週期的方法調用中共享)將userCart變量存儲爲結構而不是數組。然後,通過一些技巧,我們根據購物車商品的唯一ID向結構中添加新的關鍵字,並創建一個子結構:一個用於保存實際商店項目(位於「商品」鍵中)和一個用於保存/更新數量(在'數量'鍵中)。

如果您決定在SESSION中實例化/存儲CFC,那麼使用結構作爲您的存儲機制而不是陣列,將允許您構建多服務器羣集支持的CF9應用程序。

因此,要總結:

<cfset SESSION.myCartItemCount = ArrayNew(1) /> 

支持。

<cfset SESSION.user = CreateObject('component','model.objects.user') /> 

支持,如果沒有陣列存儲的CFC內部。

<cfset SESSION.cart = CreateObject('component','model.objects.cart') /> 

不支持,如果有內部讀取/寫入到陣列。

將數組更改爲引擎蓋下的結構,您就可以走了。

+0

非常感謝!非常詳細的答案。 – Seybsen 2011-12-19 05:39:11

+0

你知道爲什麼我們不能使用一個會話作用域CFC的數組嗎?它僅適用於會話複製或正常會話嗎? – LarZuK 2011-12-20 08:25:15