Ich arbeite in einem Abschnitt eines Perl-Moduls, das eine große CSV-Antwort erstellt. Der Server läuft auf Plack, auf dem ich weit von Experte bin.
Momentan verwende ich so etwas, um die Antwort zu senden:
%Vor% Diese Funktion query_data
ist jedoch keine schnelle Funktion und ruft viele Datensätze ab. Dort verkette ich jede Zeile in $body
und nachdem alle Zeilen verarbeitet wurden, sende ich die ganze Antwort.
Ich mag das aus zwei offensichtlichen Gründen nicht: Erstens braucht es viel RAM, bis $body
zerstört ist. Zweitens sieht der Benutzer keine Antwortaktivität, bis diese Methode fertig ist und die Antwort tatsächlich mit $res->body($body)
sendet.
Ich habe versucht, eine Antwort auf diese in der Dokumentation zu finden, ohne zu finden, was ich brauche.
Ich habe auch versucht, $res->body($row_object->to_csv)
in meinem Callback-Abschnitt aufzurufen, aber es scheint so, als würde ich nur den letzten Aufruf an $res->body
senden und alle vorherigen überschreiben.
Gibt es eine Möglichkeit, eine Plain-Antwort zu senden, die den Inhalt jeder Zeile löscht, so dass der Benutzer Inhalte in Echtzeit empfängt, während die Daten gesammelt werden und ohne dass alle Daten in einer verifizierbaren Liste zusammengefasst werden müssen?
Vielen Dank im Voraus für Kommentare!
Sie können Plack :: Response nicht verwenden, da diese Klasse dazu gedacht ist, eine vollständige Antwort darzustellen, und Sie Ich werde nie eine vollständige Antwort in Erinnerung haben. Was Sie versuchen zu tun, heißt Streaming, und PSGI unterstützt es auch wenn die Antwort von Plack :: nicht stimmt.
Gehen Sie folgendermaßen vor, um es zu implementieren (angepasst von Ihrem Beispielcode):
%Vor%Einige interessante Dinge über diesen Code:
Plack::Response
zurückzugeben, können Sie ein sub
zurückgeben. Dieses Unterprogramm wird einige Zeit später aufgerufen, um die tatsächliche Antwort zu erhalten. PSGI unterstützt dies, um so genannte "verzögerte" Antworten zu ermöglichen. coderef
ist (in diesem Fall $responder
), das aufgerufen werden und die echte Antwort übergeben sollte. Wenn die reale Antwort nicht den "Körper" enthält (d. H. Was normalerweise das dritte Element von arrayref
ist), dann wird $responder
ein Objekt zurückgeben, in das wir den Körper schreiben können. PSGI unterstützt dies, um Streaming Antworten zu ermöglichen. $writer
-Objekt hat zwei Methoden, write
und close
, die genau so funktionieren, wie ihre Namen vermuten lassen. Vergessen Sie nicht, die Methode close
aufzurufen, um die Antwort abzuschließen. Der obige Code zeigt dies nicht, da es wie abhängig von query_data
und Ihrem anderen Code funktioniert. $env->{'psgi.streaming'}
überprüfen, um sicher zu sein, dass es bei Ihnen der Fall ist. Plack ist Middleware. Verwenden Sie darüber hinaus ein Web Application Framework wie Mojolicious oder Dancer2 oder etwas wie Apache oder Starman Server darunter? Das würde beeinflussen, wie die Pufferung funktioniert.
Der obige Link zeigt ein Beispiel von Placks Autor: Ссылка
Oder Sie können es einfach tun, indem Sie Dancer2 auf Plack und Starman oder Apache verwenden: Ссылка
Grüße, Peter