2016-06-03 2 views
3

Ich schreibe eine App auf Silex in Übereinstimmung mit der Dokumentation, aber mit einigen Ergänzungen. Ich erkläre die Route, nach Middleware für Route und Middleware für App beenden.Wie kann man silex "finish" Middleware korrekt verwenden, um schwere Vorgänge im Hintergrund zu verarbeiten?

Der obige Code funktioniert, wie ich brauche: Antwort wird gesendet, Browser Spinner wird gestoppt, schwere Operation wird im Hintergrund verarbeitet. Aber es gibt eine offene Frage: Ist es notwendig, Header in die Antwort nach Middleware und Flush Buffer in fertig Middleware hinzufügen? Ohne diese Manipulationen wird die Serverantwort erst nach Abschluss des Fertigstellungs-Middleware-Handlers empfangen.

+0

Würden Sie bitte bitte mehr Licht auf diese Fragen und Antworten werfen, da ich genau das gleiche bin. Es wäre hilfreich, wenn Sie sich etwas Zeit nehmen könnten, um Ihrer Frage weitere Erklärungen hinzuzufügen und eine ausführlichere Antwort zu geben. Tnx im Voraus. Zum Beispiel, wie könnten Sie feststellen, was die Quelldaten für die PDF sind, wie Abschluss auf allen Routen ausgelöst wird – Trix

+0

@Trix Wenn ich Sie richtig verstehe, müssen Sie den Browser über eine neue PDF-Datei informieren. Zu diesem Zweck können Sie WebSocket verwenden. Auf diese Weise müssen Sie das Ergebnis des Finish-Middleware-Handlers nicht direkt überwachen. – IvanMalenko

+0

@Trix Meine Aufgabe war wie folgt: Benutzereingaben speichern, PDF-Berichte basierend darauf erstellen und einen Brief mit diesem Bericht senden. Nach der Verarbeitung der Benutzereingaben sende ich eine Antwort an den Browser und schließe die Verbindung ("nach" -Abschnitt). Im Abschnitt "finish" bearbeite ich $ response object, generiere eine Datei und sende einen Brief (hier keine Benachrichtigungen an den Browser). – IvanMalenko

Antwort

1

Ich denke, dass es notwendig ist.
->after( ist RESPONSE Ereignis, das aufgerufen wird, wenn die Antwort vorbereitet, aber nicht gesendet wird. In Ihrem Fall werden alle notwendigen Header hinzugefügt, um die Verbindung zu schließen, wenn der Browser eine Antwort erhält.
->finish( ist TERMINATE Ereignis, das nach dem Senden der Antwort aufgerufen wird. flush() - Ich denke, dass es verwendet wurde, um die Antwort vom Server-Puffer zum Browser zu leeren.

+0

Aber das "TERMINATE" -Ereignis tritt nach Senden einer Antwort an den Browser und alle Caches werden gelöscht durch fastcgi_finish_request/ob_end_flush/ob_end_clean (nichts zu senden, danach) und nur dann "fertig" Middleware-Handler aufgerufen. Fehle ich etwas? – IvanMalenko

+0

'fastcgi_finish_request' - es ist php-fpm Funktion. Benutzt du php-fpm? –

+0

Nein, ich habe nur eine Reihe möglicher Funktionen aufgelistet. Einer von ihnen rief nach dem Senden der Antwort (in Symfony \ Component \ HttpFoundation \ Response). – IvanMalenko

Verwandte Themen