From 24f6b9ed716e385fa26ca68b1d78bd1969b22fcd Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Mon, 2 May 2016 14:37:47 +0200 Subject: [PATCH] Dispatcher: Restart bei hohem Memory-Verbrauch via exec anstelle von exit MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Wenn sich das Script im Fall von zu hohem Speicherverbrauch beendet, so kann es sein, dass der Webserver bereits den nächsten Request zum Script geschickt hat. Ist das der Fall, kommt es zu einem internal server error für den User. Statt dessen kann sich das Script selber ausführen. Dadurch werden die Kommunikationskanäle zwischen Webserver und Script (STDIN, STDOUT, STDERR) aufrechterhalten. --- SL/Dispatcher.pm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/SL/Dispatcher.pm b/SL/Dispatcher.pm index 632202735..ec6da1beb 100644 --- a/SL/Dispatcher.pm +++ b/SL/Dispatcher.pm @@ -226,14 +226,17 @@ sub _run_controller { sub handle_all_requests { my ($self) = @_; + my $restart; my $request = FCGI::Request(); while ($request->Accept() >= 0) { $self->handle_request($request); - if (_memory_usage_is_too_high()) { - $request->Flush(); - last; + if (($self->interface_type eq 'FastCGI') && _memory_usage_is_too_high()) { + $request->LastCall(); + $restart = 1; } } + + exec $0 if $restart; } sub handle_request { -- 2.20.1