Philipp Hasenfratz: fork => END-Blöcke in separatem Prozess ausführen

Beitrag lesen

Halihallo Forumer

Ich habe eine Webapplikation, wo viele automatische Aufgaben erledigt werden müssen (z. B. Mails senden, empfangen [das schluckt am meisten Zeit]). Diese Aufgaben werden in den jeweiligen Modulen in den END {...} - Blöcken ausgeführt. Nun habe ich festgestellt, dass diese auf dem Webspace ziemlich langsam sind... Jedesmal auf den POP zugreifen, oder mit dem SMTP-Server kommunizieren oder irgend eine Antwort analysieren und in die Datenbank zu schreiben... Ich konnte zwar die Performance durch die interne Konfiguration schon erheblich steigern, aber ich denke, dass es hierfür noch eine weitere Verbesserung gibt:

use POSIX;
$SIG{CHLD} = 'IGNORE';

wird beim beenden gestartet:

my $pid = fork();
   die 'could not fork' unless (defined $pid);
   if ($pid == 0) {
      # child
      close STDOUT; close STDERR;
      open( STDOUT, '>./t.txt' );
      exit(0);   # calls END Blocks on Schedulers (Automatisms)
   } else {
      # parent, $pid is child-pid
      POSIX::_exit(0);  # no END Block is ever called -> exits immediately
   }

also: der Sinn dieses Codes besteht darin, beim 'die' oder 'exit' des Hauptprogrammes den Prozess über POSIX abzuwürgen (sodass der Client den Output kriegt und das Programm auf dem Server nicht weiter ausgeführt wird). Aber die Autmatisationsprozesse dennoch über den Childprozess weitergeführt wird (fork), der dann die END-Blöcke ausführt.

Mit autoflush von STDOUT und close(STDOUT) hatte ich leider keine Erfolge erzielt (also, dass der Client die HTML-Seite kriegt und weiterarbeiten kann, noch bevor das Programm wirklich beendet ist).

Ich bitte um Meinungen zu dem obengenannten (über fork) Lösungsvorschlag. Was sind Risiken, was ist zu beachten, wird das Hauptprogramm dann wirklich gleich abgewürgt. Funktioniert das ohne auf den Childprozess zu warten und keine Zombies zu generieren? - Bitte verweist mich nicht auf cron oder eine völlig andere Lösung, da ich in 5 Tagen in die Ferien will und noch anderes zu tun habe (OK, ihr dürft gerne andere Vorschläge machen, die auch wenig Zeit in Anspruch nehmen, alle anderen werde ich jedoch nicht mehr vor den Ferien hinkriegen).

Viele Grüsse und Danke im Voraus

Philipp
   <-- der ziemlichen Stress hat und auf eure Hilfe hofft :-(((