2012-01-02 28 views
5

Tôi đã sử dụng open_uri để kéo xuống một đường dẫn ftp dưới dạng nguồn dữ liệu trong một thời gian, nhưng đột nhiên nhận thấy rằng tôi gần như liên tục "530 Rất tiếc, số lượng khách hàng được phép tối đa (95) đã được kết nối."Ổ cứng 'open_uri' có đóng đáng tin cậy của Ruby sau khi đọc hay không?

Tôi không chắc liệu mã của tôi có bị lỗi hoặc nếu ai đó đang truy cập máy chủ và tiếc là không có cách nào để tôi thực sự biết chắc chắn ai là người có lỗi.

Về cơ bản tôi đang đọc FTP URI với:

def self.read_uri(uri) 
    begin 
     uri = open(uri).read 
     uri == "Error" ? nil : uri 
    rescue OpenURI::HTTPError 
     nil 
    end 
    end 

Tôi đoán rằng tôi cần phải thêm một số lỗi thêm xử lý mã ở đây ... Tôi muốn chắc chắn rằng tôi tận dụng mọi biện pháp phòng ngừa để đóng tất cả các kết nối để kết nối của tôi không phải là vấn đề trong câu hỏi, tuy nhiên tôi nghĩ rằng open_uri + đọc sẽ có biện pháp phòng ngừa này vs bằng cách sử dụng Net :: FTP phương pháp.

Điểm mấu chốt là tôi phải chắc chắn 100% rằng các kết nối này đang bị đóng và tôi không bằng cách nào đó có một kết nối mở bó nằm xung quanh.

Ai đó có thể vui lòng thông báo cho đúng cách sử dụng read_uri để kéo ftp với một đảm bảo rằng nó đóng kết nối? Hoặc tôi nên chuyển logic sang Net :: FTP có thể kiểm soát nhiều hơn về tình hình nếu open_uri không đủ mạnh?

Nếu tôi cần sử dụng phương pháp Net :: FTP, có phương pháp đọc mà tôi nên quen thuộc với vs kéo nó xuống vị trí tmp và sau đó đọc (như tôi muốn giữ nó trong một bộ đệm vs fs nếu có thể)?

+1

Tôi không quen thuộc với 'read_uri' và đang gặp khó khăn đáng ngạc nhiên việc tìm kiếm kết quả tìm kiếm. Bạn có nhớ chia sẻ một đoạn mã yêu cầu và/hoặc sử dụng mã không? –

+0

LOL, tôi xin lỗi. Tôi đã viết mã này một vài tháng trước và quên rằng tôi đã định nghĩa read_uri như sau (nhận ra tại thời điểm tôi cần thêm xử lý lỗi nhiều hơn: http://j.mp/tNHpmr – ylluminate

+0

Giả sử rằng bạn không chạy các cửa sổ bạn có thể có thể thấy những gì đang xảy ra từ phía bạn với chạy "netstat" trong dấu nhắc lệnh – sunkencity

Trả lời

6

tôi nghi ngờ bạn không đóng tay cầm. OpenURI's docs bắt đầu với nhận xét này:

It is possible to open http/https/ftp URL as usual like opening a file: 

open("http://www.ruby-lang.org/") {|f| 
    f.each_line {|line| p line} 
} 

tôi nhìn vào nguồn và phương pháp open_uri không đóng dòng nếu bạn vượt qua một khối, vì vậy, tinh chỉnh ví dụ trên để phù hợp với mã của bạn:

uri = '' 
open("http://www.ruby-lang.org/") {|f| 
    uri = f.read 
} 

Nên giúp bạn gần gũi với những gì bạn muốn.


Dưới đây là một cách để xử lý các trường hợp ngoại lệ:

# The list of URLs to pass in to check if one times out or is refused. 
urls = %w[ 
    http://www.ruby-lang.org/ 
    http://www2.ruby-lang.org/ 
] 

# the method 
def self.read_uri(urls) 

    content = '' 

    open(urls.shift) { |f| content = f.read } 
    content == "Error" ? nil : content 

    rescue OpenURI::HTTPError 
    retry if (urls.any?) 
    nil 
end 
+0

Được rồi, vâng, tôi tin rằng bạn đã chính xác ở đây. Tôi đã tìm thấy những điều tương tự sau khi poking xung quanh một số. Cảm ơn! Tôi sẽ đưa ra một phát bắn và xem liệu mọi thứ có bình tĩnh không. – ylluminate

+0

Vâng, tốt để biết nó không phải là tôi bây giờ. Tuy nhiên tôi vẫn nhận được các lỗi của quá nhiều kết nối. Khi điều này xảy ra, tôi cần chuyển các bánh răng sang một máy chủ dự phòng. Làm thế nào bạn sẽ thêm một xử lý ngoại lệ cho điều này vì vậy nếu một lỗi được ném, hãy thử bước vào một URI khác? – ylluminate

+0

Những gì bạn cũng có thể được chạy vào, là TCP sẽ dự trữ một kết nối trong một khoảng thời gian sau khi nó đã được đóng lại, nhưng tôi không nhớ bao lâu đó là ngay bây giờ. Bạn có thể yêu cầu quá nhiều tệp trong cửa sổ đó, làm cạn kiệt số lượng sẵn có. –

4

Hãy thử sử dụng một khối:

data = open(uri){|f| f.read} 
+0

Vâng, cảm ơn. Khối dường như đã giúp.Ước gì tôi có thể chia nhỏ câu trả lời vì tôi không thể thấy ai đã đăng chính xác đầu tiên, nhưng vì câu trả lời khác có thêm chi tiết, tôi sẽ tiếp tục và gán nó làm câu trả lời. Nhưng cảm ơn! – ylluminate

Các vấn đề liên quan