]> wagnertech.de Git - kivitendo-erp.git/commitdiff
Dispatcher: Restart bei hohem Memory-Verbrauch via exec anstelle von exit
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 2 May 2016 12:37:47 +0000 (14:37 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 3 May 2016 16:10:26 +0000 (18:10 +0200)
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

index 632202735963f79d7e69a9fb7de2d026f3a57de5..ec6da1beb62acf0d6dff9073d5a007c9014c6563 100644 (file)
@@ -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 {