2011-04-13 99 views
4

我們有一個在Rails 3 Spree平臺上運行的在線商店。最近客戶開始在結帳期間報告奇怪的錯誤,並在分析生產日誌後發現以下錯誤:Rails 3 - 文件名太長錯誤

Errno :: ENAMETOOLONG(文件名太長 -/var/www/store/tmp/cache/UPS-R43362140-US- NJ-FlorhamPark07932-1025786194_1%7C1025786087_1%7C1025786089_15%7C1025786146_4%7C1025786147_3%7C1025786098_3%7C1025786099_4%7C1025786100_2%7C1025786114_1%7C1025786120_1%7C1025786121_1%7C1025786181_1%7C1025786182_1%7C1025786208_120110412-2105-1e14pq5.lock)

我不知道爲什麼這個文件名太長,如果這個錯誤是特定於Rails或Spree的,我也不是很熟悉Rails緩存系統。可以解決這個問題

回答

5

我猜你正在使用spree_active_shipping,因爲這看起來像是一個UPS航運報價的緩存ID。當有人創建一個包含大量訂單項的訂單時,就會發生這種情況。如果有足夠的訂單項,這當然會爲緩存創建一個非常大的文件名,從而爲您提供錯誤。

一種選擇是使用memcache或redis作爲Rails.cache而不是使用文件系統緩存。另一種方法是修改在spree_active_shipping gem的app/models/active_shipping.rb中生成cache_key的算法。

後面的選項可能是最好的,你可以簡單地讓生成的緩存鍵通過像MD5或SHA1這樣的散列運行。這樣你將得到可預測的緩存密鑰長度。

真的,這應該在spree_active_shipping中修復,儘管它不應該生成不可預知的長緩存鍵,即使使用了鍵值存儲,也是浪費內存。

3

它與你的文件系統更相關,可以設置支持更長文件名的文件系統或更改軟件以使其更好(md5?timestamp?unique id?)文件n埃姆斯。

0

我使用軌3.2.x和具有相同的問題。我最終在用於生成緩存鍵的視圖幫助器方法中生成MD5摘要。

FILENAME_MAX_SIZE = 200  
def cache_key(prefix, params) 
    params = Array.wrap(params) if params.instance_of?(String) 
    key = "#{prefix}/" << params.entries.sort { |a,b| a[0].to_s <=> b[0].to_s }.map { |k,v| "#{k}:#{v}"}.join(',').to_s 
    if URI.encode_www_form_component(key).size > FILENAME_MAX_SIZE 
    key = Digest::MD5.hexdigest(key) 
    end 
    key 
end 

這裏我使用URI.encode_www_form_component(key).size,因爲你可以看到在我的情況下,使用:,分離生成緩存鍵檢查URI編碼的鍵值的長度。在緩存結果之前,Rails對密鑰進行編碼。我參考了pull request

相關問題