Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] E-Mails "parallel" versenden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tjommel
    hat ein Thema erstellt [Erledigt] E-Mails "parallel" versenden.

    [Erledigt] E-Mails "parallel" versenden

    Moin zusammen,

    ich habe eine Webseite mit recht hohen User bewegungen. Unter anderen befindet sich doch auch ein Nachrichtensystem.

    Immer wenn eine Nachricht erstellt wird wird auch eine E-Mail an den empfänger gesendet ("John Doe hat dir eine Nachricht gesendet").

    Leider dauert der E-Mail versand recht lange (1-3 sekunden), daher war meine Idee einfach nur irgendwo ein Flag zu setzen und im hintergrund dann die E-Mails zu versenden. Damit würde der User dann sofort auf die Zeilseite gelangen und müsste nicht erst noch warten bis der Server die Mail versendet hat.

    Dazu habe ich mir folgende lösungen ausgedacht:

    1.) Über eine Datenbanktabelle:
    Ich erstelle einfach eine Datenbanktabelle in der ich den email-typ und de typ-id (mehr brauche ich nicht, da Text und co. separat erstellt werden).
    Dann lese ich regelmäßig über runwhen die Daten aus, sende die mails und lösche die Sätze.

    2.) Über eine Flag-Datei:
    Ich erstelle einfach eine Flag-Datei (bsp. TYP.ID) in einem Verzeichnis. Diese lese ich dann regelmäßig über runwhen (Dateiname reicht, der Inhalt ist leer) sende die mail und lösche die Datei.

    Nun weiß ich nicht was besser ist.
    Zum einen wäre die SQL Methode bestimmt schneller, jedoch habe ich nur 20 Verbindungen auf dem shared-hoster.
    Zum anderen entlaste ich bei Lösung 2 zwar den sql-server, da aber Dateizugriffe in der Regel mit php länger dauern, ist diese Lösung vllt etwas unperformant.

    Was meint ihr? Gibt es vielleicht noch eine besser Möglichkeit? Vllt nur eine Datei die ich auslese und dort stehen dann alle TYPen+ID je zeile?

    Tjommel

  • rkr
    antwortet
    HHVM kann async: http://docs.hhvm.com/manual/en/hack.async.php

    Ansonsten: Gearman, RabbitMQ/ActiveMQ, Cronjob und/oder PCNTL/Fork

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    Direktversand ist Mist, vor allem bei hohem Mailverkehr. Es wird für jeden Versand eine neue Verbindung aufgemacht, merkste ja selber das dein Script stockt, wenn du nur 20 Verbindungen zur Verfügung hast.
    Sammle und versende im Rutsch alle X Sekunden/Minuten.

    Einen Kommentar schreiben:


  • Andreas
    antwortet
    Mein Rat: Nimm die Datenbanktabelle. pcntl_fork ist zwar eine Lösung aber wenn dann mal wirklich viele Mails versendet werden müssen, greift das Betriebssystem eventuell ein, um Prozesse zu beenden und Mails werden nicht mehr alle versendet. In einer Datenbank hast du Transaktionssicherheit und es ist gewährleistet, dass alle Mails auch richtig verschickt werden. Die Datenbanktabelle könntest du dann bei höherer Last auch mit etwas leistungsfähigerem als mit PHP verarbeiten (z.B. einen Dienst in C schreiben oder sowas).

    Ein weiterer Vorteil: Beim Debuggen, warum Mails nicht versendet werden bzw. ob Mails versendet worden sind, kannst du das ganz leicht über eine Datenbankabfrage prüfen.

    Einen Kommentar schreiben:


  • Tjommel
    antwortet
    Danke! Genau das was ich gesucht habe.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    http://php.net/manual/de/function.pcntl-fork.php

    Einen Kommentar schreiben:


  • Tjommel
    antwortet
    Zitat von Geromel Beitrag anzeigen
    Mailerklasse? Damit sollte das problem und 100 weitere gelöst werden.
    An was für eine Mailerklasse hast du gedacht?

    Wenn ich eine Mailerklasse verwende... dann wird die Mail doch immer noch vom aktuellen Prozess aus versendet ob "blockiert" die weitergaben an den Client.

    Mein jetziger Mailversand funktioniert 1A.

    Einen Kommentar schreiben:


  • Geromel
    antwortet
    Mailerklasse? Damit sollte das problem und 100 weitere gelöst werden.

    Einen Kommentar schreiben:


  • Tjommel
    antwortet
    Mittels
    PHP-Code:
    mail($to$subject$body$headers); 
    Wobei es auch vorkommen kann das ich noch einen Anhang in der Mail habe.

    Einen Kommentar schreiben:


  • Tropi
    antwortet
    Wie versendest du die Mails? Normalerweise sollte der Versand nicht blockieren, sondern einfach in eine Queue beim Mailer Daemon gehängt werden. D.h. die sollten ohnehin immer im Hintergrund verschickt werden.

    Einen Kommentar schreiben:

Lädt...
X