2010-03-04 31 views
5

Vì vậy, hãy nói rằng tôi đang viết một máy chủ web và tôi muốn hỗ trợ tải lên tệp "rất lớn". Cho phép giả định thêm rằng tôi muốn thực hiện điều này thông qua loại MIME/đa dữ liệu mẫu chuẩn. Tôi nên nói rằng tôi đang sử dụng erlang và tôi dự định thu thập các gói http khi chúng được trả lại từ erlang:decode_packet/2, nhưng tôi không muốn thực sự thu thập yêu cầu cho đến khi trình xử lý yêu cầu http tìm thấy địa điểm tải lên. Tôi có nênLàm cách nào để xử lý các tệp tải lên rất lớn trong máy chủ web Erlang?

a) tiếp tục và thu thập dữ liệu của cơ thể, bỏ qua khả năng nó rất lớn và do đó có thể làm máy chủ bị trục trặc do hết bộ nhớ?

b) không tiếp nhận trên ổ cắm của bất kỳ cơ quan yêu cầu nào (có thể không tồn tại) cho đến sau khi tiêu đề đã được xử lý?

c) làm điều gì khác?

Ví dụ cho câu trả lời c có thể là: sinh ra một quy trình khác để thu thập và ghi nội dung đã tải lên tới vị trí tạm thời (để giảm thiểu sử dụng bộ nhớ), đồng thời đưa vị trí đó đến trình xử lý yêu cầu http để xử lý trong tương lai. Nhưng tôi không biết - có một kỹ thuật tiêu chuẩn ở đây không?

+0

Vâng, sự đồng thuận dường như là cách tiêu chuẩn là làm những gì tôi đã đề xuất cho tùy chọn c. Tuy nhiên, tôi cảm thấy rằng phải có một cách tốt hơn - tôi bị làm phiền bởi sự lúng túng của các tệp tạm thời - chúng yêu cầu các cổng bổ sung mở ra (nhiều lần nếu tôi dự định đọc tệp vào một thời điểm nào đó) và chúng phân chia giữa hai hoặc nhiều quy trình mà tôi muốn được xử lý bởi một. Đây là, tuy nhiên, những gì tôi đã có kế hoạch để làm - Tôi muốn hopped rằng ai đó có thể làm việc theo một cách khác nhau. – Aoriste

+0

Bạn cần lưu trữ dữ liệu. Thực tế điều này được thực hiện trong bộ nhớ hoặc trên thiết bị lưu trữ. Câu hỏi của bạn nói rằng bộ nhớ không phải là một lựa chọn; bình luận của bạn nói rằng bạn không thích lưu trữ nó trên một thiết bị. Lựa chọn duy nhất còn lại là huyền bí ... – Zed

Trả lời

2

Trong tùy chọn ý kiến ​​của tôi, b rõ ràng là cấp trên.

Trong khoảng thời gian bạn không đọc ổ cắm, mã TCP sẽ tiếp tục đệm dữ liệu đến trong hạt nhân. Vì nó làm như vậy, nó sẽ quảng cáo kích thước cửa sổ TCP nhỏ hơn và nhỏ hơn cho máy chủ HTTP, cho đến khi cuối cùng (khi TCP nhận các bộ đệm trong hạt nhân đầy), cửa sổ TCP sẽ đóng lại.

Nói cách khác, bằng cách không đọc ổ cắm, bạn đang cho phép kiểm soát luồng TCP thực hiện công việc của mình.

+0

Tôi đã bí mật tìm kiếm lý do để làm b, cảm ơn vì đã giúp đỡ. Từ tôi, nó có ý nghĩa tốt hơn từ việc bảo trì mã, nhưng điều này là không đủ để tôi thực hiện nó. – Aoriste

0

Trong triển khai của tôi, tôi sử dụng ví dụ của bạn cho câu trả lời c - Tôi đọc từ đoạn ổ bằng đoạn và lưu trữ các đoạn vào tệp tạm thời. Ngoài ra, afaik yaws sử dụng kỹ thuật simillar - bạn có thể thấy nó tại yaws/src/yaws_multipart.erl

0

Lưu trữ vào một tệp tạm thời cũng là cách PHP thực hiện mọi thứ, vì vậy đó là một cách thử và thử nghiệm. Bạn có thể đếm các byte nhận được và ngắt kết nối nếu nó đạt đến kích thước không có ý nghĩa.

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