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

  • [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


  • #2
    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.

    Kommentar


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

      Kommentar


      • #4
        Mailerklasse? Damit sollte das problem und 100 weitere gelöst werden.
        Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

        Kommentar


        • #5
          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.

          Kommentar


          • #6
            http://php.net/manual/de/function.pcntl-fork.php

            Kommentar


            • #7
              Danke! Genau das was ich gesucht habe.

              Kommentar


              • #8
                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.
                Fynder - http://www.fynder.de - Tutorials zum Thema Technik

                Kommentar


                • #9
                  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.
                  Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                  Kommentar


                  • #10
                    HHVM kann async: http://docs.hhvm.com/manual/en/hack.async.php

                    Ansonsten: Gearman, RabbitMQ/ActiveMQ, Cronjob und/oder PCNTL/Fork
                    Standards - Best Practices - AwesomePHP - Guideline für WebApps

                    Kommentar

                    Lädt...
                    X