Senden einer ungepufferten Antwort in Plack

9

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!

    
Francisco Zarabozo 28.07.2015, 00:24
quelle

3 Antworten

2

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:

  • Anstatt ein Objekt 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.
  • Die von uns zurückgegebene Subroutine erhält ein Argument, das ein 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.
  • Das $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.
  • Die meisten Server unterstützen das Streaming so. Sie können $env->{'psgi.streaming'} überprüfen, um sicher zu sein, dass es bei Ihnen der Fall ist.
ccm 03.01.2017, 20:41
quelle
-1

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

    
Peter Edwards 27.10.2016 09:13
quelle
-2

Etwas Lesematerial für Sie:)

Also kopieren / einfügen / anpassen und bitte zurück melden

    
optional 31.07.2015 00:51
quelle

Tags und Links