Một trong những trách nhiệm của ứng dụng Rails của tôi là tạo và phục vụ các xml đã ký. Bất kỳ xml đã ký nào, khi đã tạo, không bao giờ thay đổi. Vì vậy, tôi lưu trữ mọi xml trong thư mục public
và chuyển hướng máy khách một cách thích hợp để tránh việc xử lý không cần thiết từ bộ điều khiển.Cung cấp các tệp zip động thông qua Apache
Bây giờ tôi muốn một tính năng mới: mỗi xml được liên kết với một ngày và tôi muốn triển khai khả năng phân phối tệp nén chứa mọi xml có ngày nằm trong khoảng thời gian được chỉ định bởi ứng dụng khách. Tuy nhiên, khoảng thời gian không thể giới hạn dưới một tháng để tính năng này hữu ích và điều này ngụ ý rằng một số tệp zip được phân phát sẽ lớn tới 50 triệu.
Ứng dụng của tôi được triển khai làm mô-đun Hành khách của Apache. Do đó, hoàn toàn không thể chấp nhận để phục vụ tệp với send_data
, vì khách hàng sẽ phải đợi toàn bộ tệp nén được tạo trước khi quá trình tải xuống thực sự bắt đầu. Mặc dù tôi có ý tưởng về cách triển khai tính năng trong Rails để tệp nén được sản xuất trong khi đang được phục vụ, tôi cảm thấy máy chủ của mình sẽ khan hiếm tài nguyên khi một số quy trình Ruby/Hành khách dài được phân bổ để phục vụ các tệp zip lớn.
Tôi đã đọc khoảng a better solution để phân phối tệp tĩnh qua Apache, chứ không phải tệp động.
Vì vậy, giải pháp cho vấn đề là gì? Tôi có cần thứ gì đó giống như một trình xử lý Apache tùy chỉnh không? Làm cách nào để tôi thông báo cho Apache, từ ứng dụng của tôi, cách xử lý yêu cầu, nén tệp và truyền trực tuyến kết quả cùng một lúc?
Chỉ mục định dạng tệp ZIP ở cuối tệp. Ngoài ra tôi liếc nhanh qua RFC 2616 (HTTP 1.1) và độ dài thay đổi tương tự như vậy có thể hoạt động mặc dù thông thường độ dài nội dung sẽ được công bố. Về mặt kỹ thuật, điều này có thể xảy ra theo như tôi thấy. – erloewe
Không có sự cố HTTP nào mà không biết trước về độ dài, đây là mã hóa chuyển mã chunked. Bạn có thể viết các byte trông giống như một tập tin zip trong bất kỳ ngôn ngữ nào, chỉ cần chắc chắn rằng bạn sẽ xóa đầu ra định kỳ. – covener