Eine der Verantwortlichkeiten meiner Rails-Anwendung ist das Erstellen und Servieren von signierten Xmls. Jedes signierte XML wird nach der Erstellung niemals geändert. Also speichere ich jedes xml im Ordner public
und leite den Client entsprechend um, um unnötige Verarbeitung vom Controller zu vermeiden.Serving dynamische Zip-Dateien durch Apache
Jetzt möchte ich eine neue Funktion: Jede XML ist mit einem Datum verbunden, und ich möchte die Fähigkeit implementieren, eine komprimierte Datei mit jedem XML, dessen Datum in einem vom Client angegebenen Zeitraum liegt, zu liefern. Dennoch kann der Zeitraum nicht auf weniger als einen Monat begrenzt werden, damit das Feature nützlich ist, und das bedeutet, dass einige gezippte ZIP-Dateien bis zu 50 Millionen betragen.
Meine Anwendung wird als Passagiermodul von Apache bereitgestellt. Daher ist es völlig inakzeptabel, die Datei mit send_data
zu bedienen, da der Client warten muss, bis die gesamte komprimierte Datei generiert wurde, bevor der eigentliche Download beginnt. Obwohl ich eine Idee habe, wie man das Feature in Rails implementiert, so dass die komprimierte Datei produziert während geliefert wird, fühle ich, mein Server wird knapp auf Ressourcen, wenn einige lange Ruby/Passenger Prozesse zugewiesen sind, große Zip-Dateien dienen.
Ich habe über a better solution gelesen, um statische Dateien über Apache, aber nicht dynamische zu dienen.
Also, was ist die Lösung für das Problem? Benötige ich etwas wie einen benutzerdefinierten Apache-Handler? Wie informiere ich Apache über meine Anwendung, wie man mit der Anfrage umgeht, die Dateien komprimiert und das Ergebnis gleichzeitig streamt?
Der ZIP-Dateiformat Index am Ende der Datei ist. Ich habe auch schnell durch RFC 2616 (HTTP 1.1) geschaut und die Antwort mit variabler Länge funktioniert wahrscheinlich, obwohl normalerweise die Inhaltslänge angekündigt werden sollte. Technisch sollte das soweit möglich sein. – erloewe
Es gibt kein HTTP-Problem, wenn die Länge nicht im Voraus bekannt ist. Dafür ist die chunked Transfer-Codierung zuständig. Sie können Bytes schreiben, die wie eine Zip-Datei in einer beliebigen Sprache aussehen. Achten Sie darauf, die Ausgabe regelmäßig zu leeren. – covener