Harald Gabler: Parallele Verarbeitung

Beitrag lesen

Morgen,

erstmal danke für deine Bemühungen.

Schwierig. Und wenn es wirklich "jede Menge" Doppelpostings gibt, ist dein Forum besser und häufiger besucht als das Forum hier.

Präziser: Jede Menge im Verhältnis zum Posting-Aufkommen, also etwa 25-30%.

Also, was passiert nun wirklich zuerst: die Bestätigung oder der mail-Versand?

Zuerst die Bestätigung, dann der Mailversand. Offenbar erfolgt die HTML-Ausgabe erst, wenn das komplette Script abgearbeitet ist.

Es handelt sich im großen und ganzen um das Script WWWBoard von Matt Wright. Der Mailversand erfolgt am Ende des Script mit folgender Subroutine:

sub mail_list {
   open(LIST,"$cgi_dir/$list_file");
   @addresses=<LIST>;
   close(LIST);
   foreach $member(@addresses) {
      open (MAIL, "|$mailprog $member") || die "Fehler beim Öffnen von $mailprog!\n";
      print MAIL "From: $recipient\n";
      print MAIL "Subject: $title: $subject\n";
      print MAIL "To: $member\n";

print MAIL "Es gibt eine neue Nachricht im\n";
      print MAIL "$title: $baseurl/ \n";
      print MAIL "Die Nachricht "$subject" wurde geschrieben\n";
      print MAIL "von $name, am $long_date";
      if ($followup == 1) {
         print MAIL ",\nals Antwort auf "$origsubject", geschrieben\n";
         print MAIL "von $origname, am $origdate";
      }
      print MAIL ".\n";
      print MAIL "============================================================\n\n";
      print MAIL "$FORM{'body'}\n\n";
      print MAIL "============================================================\n";
      print MAIL "Diese E-Mail wurde automatisch erstellt. Wenn Sie auf\n";
      print MAIL "diese Nachricht antworten wollen, gehen Sie bitte zum\n";
      print MAIL "$title: $baseurl/ \n\n";
      print MAIL "Falls Sie sich aus der Mailingliste austragen wollen, gehen\n";
      print MAIL "Sie bitte ebenfalls zum $title.\n";

close (MAIL);
      $x++;
   }
}

Grundsätzlich könntest du mit einem "lock"-file dafür sorgen, daß derjenige, der gerade geschrieben hat, keine Doppelpostings absenden kann und erst wieder schreibberehctigt ist, wenn alle anderen anstehenden Vorgänge einschließlich mail-Versand erledigt sind.

Wenn möglich, möchte ich zuerst die Ursache bekämpfen.

wie rufe ich ein PerlScript aus einem PerlScript auf
Mit "include" oder "require"

Könnte ich mal ausprobieren. Allerdings dachte ich immer, ein mit "require" eingebundenes Script verhält sich genauso, als würde es direkt im Hauptscript stehen. Wenn dem so ist, ändert sich nichts.

In deinem Fall wärs wahrscheinlich günstiger, mit einer if/else-Abfrage nachzuschauen, ob der mail-Versand erledigt ist und dann erst die "Bestätigung" anzeigen zu lassen.

Genau das will ich nicht. Der Versand der z. Z. etwa 40 Mails dauert 30-40 Sek. Das ist für viele zu lange und es kommt zu nervösen Zuckungen im Klickfinger (trotz dem Hinweis "Bitte nur einmal klicken und warten").

Mein Problem ist, daß der Mailversand zu lange dauert und HTML-Ausgaben offenbar erst nach Beenden des Script ausgegeben werden, egal wo sie im Script stehen bzw. wann sie erzeugt werden.

Eine Lösung, die mir vorschwebt sieht so aus:
1. Die Mail nicht direkt versenden, sondern in eine Datei schreiben.
2. Über einen Systemaufruf ein Perlscript starten, daß diese Datei an die Teilnehmer der Mailingliste
verschickt.

Leider weiß ich nicht, ob es so funktioniert bzw. ob es nicht eine viel einfachere Lösung gibt.

Viele Grüße
Harald