Ich habe ein kleines Problem mit nginx und dem Perl FCGI Modul. Ich habe eine lange Operation in meinem FCGI-Programm, das den Server (oder den Benutzer auf dem Server) am anderen Ende des Unix-Sockets überleben kann, den ich verwende, um FCGI zu kommunizieren. Ich brauche die FCGI accept () - Schleife in meinem Programm, um zu brechen, wenn die FCGI-Anfrage geschlossen wird. Ich habe versucht, INT, TERM, etc Signalhandler zu installieren, aber sie tun nichts, da die einzige Kommunikation zwischen nginx und meinem Programm über den FCGI-Socket AFAIK stattfindet.
Ich habe auch dies versucht, aber ich kann es nicht Weitere Informationen zum Verwenden des FCGI-Moduls in Perl zum Senden von Rohdaten an oder von nginx über den FCGI-Socket. Gibt es einen Weg, ich kann es tun, ohne das FCGI-Modul zu ändern, um eine "Ping" -Funktion zu haben?
Das grundlegende Problem ist, dass mein Programm nicht weiß, ob nginx die FCGI-Anfrage beendet hat.
Beispiel:
%Vor% Sie müssen eine FCGI
Implementierung verwenden, die FCGI_ABORT_REQUEST
behandelt.
Sie können Folgendes nicht verwenden, weil sie FCGI_ABORT_REQUEST
ignorieren:
Sie könnten die folgenden verwenden, die FCGI_ABORT_REQUEST
behandeln:
Bei der Verwendung von AnyEvent-FCGI
ist das Suchen nach einer abgebrochenen Anfrage so einfach wie das Aufrufen von $request->is_active()
, aber bedenken Sie, dass is_active()
nicht den wahren Status der Anfrage widerspiegelt, bis der on_request
Handler zurückkehrt, was bedeutet Sie müssen so schnell wie möglich von on_request
zurückkehren und die eigentliche Arbeit "parallel" erledigen (wahrscheinlich möchten Sie nicht Perl-Threads , aber etwas, das eher Fortsetzungen ) ist, um der AnyEvent
-Schleife die Möglichkeit zu geben Verarbeiten Sie weitere Anforderungen (einschließlich FCGI_ABORT_REQUEST
s), während Sie die langatmigen Vorgänge abschließen.
Ich bin nicht genug vertraut mit AnyEvent
, um sicher zu wissen, ob es einen besseren Weg gibt, dies zu tun, aber hier ist mein Ansatz, unten, für einen Anfang: