2010-04-30 83 views
0

我正在使用Net :: FTP庫的Ruby web應用程序。它的一部分允許用戶通過AJAX與FTP站點交互。當用戶執行某些操作並進行AJAX調用時,然後Ruby重新連接到FTP服務器,執行操作並輸出信息。通過會話變量緩存FTP連接以通過AJAX使用?

每次進行AJAX調用時,Ruby都必須重新連接到FTP服務器,這很慢。有沒有辦法可以緩存這個FTP連接?我嘗試了會話散列中的緩存,但是顯示「我們很抱歉,但是出現了問題」,並且每當我嘗試將它存儲在會話散列中時,都會在我的日誌中輸出TCP轉儲。我還沒有嘗試過memcache。

有什麼建議嗎?

+0

該死的我回答了你的其他問題,然後你刪除了它......我會在這裏張貼一秒鐘,堅持下去。 – gtd 2010-04-30 18:29:02

+0

對不起:) – 2010-04-30 19:25:44

回答

1

你正在嘗試做什麼可能,但遠非微不足道,Rails也不提供任何內置支持。實際上,您需要下載到操作系統級別以完成此操作,並且如果您擁有多臺物理服務器,則會變得更加複雜。

首先,您不能在會話中存儲連接。事實上,你不想來存儲的原因有很多出席會議的所有Ruby對象,包括但不限於:

  • 某些類型的對象都有麻煩正在編組/解組
  • 部署,如果能打破東西模式的變化和人民有outdates東西連載於他們的會話
  • 如果您在使用cookie會話存儲那麼你只有4K

所以在一般情況下,你永遠只希望把像字符串,數字和布爾元進入會議。

現在就FTP連接而言,這屬於無法可靠序列化/非序列化的事物類別。原因是因爲它不僅僅是一個Ruby對象,而且還有一個打開的套接字,一旦原始對象被垃圾收集,它就會被關閉。

因此,爲了保持FTP連接持久性,它不能存儲在控制器實例變量中,因爲控制器實例是每個請求。你可以嘗試在控制器實例之外的地方實例化它,但是如果你不仔細清理連接,那麼就有可能發生內存泄漏,而且如果你有多個應用服務器實例,那麼你也需要找到一種方法來保證用戶在每個請求中與同一個應用程序服務器實例通話,否則將無法找到掛鉤。總而言之,在Ruby進程中保持會話是開放的。

你需要做的是在一個單獨的進程中打開連接,任何ruby進程都可以與之通話。真的沒有確定的標準方式來做到這一點,你必須推出自己的。你可以看看DRb來提供你需要的一些原語。

+0

偉大的信息。顯然這是非常平凡的,需要時間,所以我現在不得不把它放在後臺。稍後我會回過頭來看看DRb,稍後再滾動一個自定義解決方案。謝謝! – 2010-04-30 19:24:51

1

AJAX無法直接與FTP通話。它專爲HTTP而設計。這並不能阻止你寫一些能夠緩存FTP服務器的東西。您可能應該對其進行分析以找出真正緩慢的情況。我的猜測是FTP訪問速度很慢。緩存它可能是一個混合的祝福,但。你怎麼知道什麼時候ftp站點的內容改變了?

+0

據我所知,AJAX不會與FTP通話;我使用Rails控制器和Ruby作爲Javascript的代理。這只是我想要緩存的TCP連接。希望服務器像你說的那樣慢。 – 2010-04-30 16:52:47