Laufzeitproblem einer PHP-Seite ...

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

  • Laufzeitproblem einer PHP-Seite ...

    Hallo an alle.

    Folgender ungefährer Code wird verwendet, um einen Newsletter zu verschicken:

    PHP-Code:
    <?
        $db = mysql_connect($cfg['mysql_host'],$cfg['mysql_user'],$cfg['mysql_pass']);
        if (!$db) die ("Kann Server nicht erreichen");
        mysql_select_db($cfg['mysql_db'],$db);
        
        $sql = "SELECT * FROM kunden";
        $result = mysql_query($sql);
        echo 'Der Newsletter wird jetzt verschickt ...<br><br>';
        
        while ($row = mysql_fetch_array($result))   
        {
            # Hier steht natürlich mehr drin an Inhalten
            # als nur bla bla bla.
            
            $text = "bla bla bla";
            
            # Hier die Mails per SMTP-Befehlen übertragen.
            
            $fp = fsockopen("localhost", 25, $errno, $errstr, 20); $line = fgets($fp, 256);
            fputs($fp, "HELO localhost\r\n"); $line = fgets($fp, 256);
            $puts($fp, "MAIL FROM: [email]adresse@adresse.de[/email]\r\n"); $line = fgets($fp, 256);
            fputs($fp, "RCPT TO: ".$row['email']."\r\n"); $line = fgets($fp, 256);
            fputs($fp, "DATA\r\n"); $line = fgets($fp, 256);
            fputs($fp, "Subject: Beispielbetreff\r\n");
            fputs($fp, "Reply-To: [email]adresse@adresse.de[/email]\r\n\r\n");
            fputs($fp, $text."\r\n");
            fputs($fp, "\r\n.\r\n"); $line = fgets($fp, 256);
            fputs($fp, "QUIT"); $line = fgets($fp, 256);
            
            sleep(5);
        }
        
        echo 'Newsletter komplett verschickt.';
        
    ?>
    Das klappt auch wunderbar, aber nach einer gewissen Zeit, sagen wir mal 3 oder 4 Stunden, "stürzt" die PHP-Seite ab. Da ungefähr 3.800 eMail verschickt werden sollten / mussten, gehe ich davon aus, dass er wohl nicht alle rausgeschickt hat, da die Seite, wie schon gesagt, nach der oben genannten Zeit "abgestürzt" ist. Jemand eine Idee, woran das liegen könnte? Am Skripttimeout wohl nicht, denn ich habe "max_execution_time" auf 345600 Sekunden gesetzt (also 4 Tage).

    Danke im Voraus.

    Innuendo

  • #2
    welche Fehlermeldung wird denn ausgegeben ?

    nach 5,3 Stunden eigentlich alle Emails (wenn es nur die 3800 sind) versendet worden sein.


    mfg
    novara
    Mit freundlichen Grüßen
    Werner

    Kommentar


    • #3
      Folgende Fehlerseite wird angezeigt:

      Kommentar


      • #4
        Und im Apache Logfile, gibt es dort eine Fehlermeldung?

        Versuch 1:
        Hast Du das ganze schon mal mit einem fclose($fp); probiert?

        Versuch 2:
        So wie Dein Skript aufgebaut ist, machst Du bei jedem Durchlauf ein fsockopen() - ohne fclose() könntest Du den fsockopen() außerhalb der Schleife legen

        Kommentar


        • #5
          Nein, im Logfile keine Fehlermeldungen diesbezüglich.

          zu Versuch 2 von Dir:
          Geht das denn überhaupt, dass ich fsockopen außerhalb der while-Schleife laufen lassen kann? Besteht dann eine permanente Verbindung zum SMTP-Server? Und was ist, wenn ich innerhalb der while-Schleife eine zweite Socket-Verbindung habe (weil ich z.B. mit der 1. die Text-Version und mit der 2. die HTML-Version des Newsletters verschicken will [vom Kunden so gewünscht, in meinen Augen Schwachsinn])?

          Habe übrigens auch mal die Sessionlaufzeit erhöht (da das Newslettersystem ein Adminsystem mit Session-Login ist).

          Kommentar


          • #6
            du brauchst dich nicht jedesmal zum SMTP verbinden,
            einmal reicht

            PHP-Code:
            $fp fsockopen("localhost"25$errno$errstr20); $line fgets($fp256);
            fputs($fp"HELO localhost\r\n"); $line fgets($fp256);

            while (
            $row mysql_fetch_array($result))   
                {
                    
            # Hier steht natürlich mehr drin an Inhalten
                    # als nur bla bla bla.
                    
                    
            $text "bla bla bla";
                    
                    
            # Hier die Mails per SMTP-Befehlen übertragen.
                    
                    
            $puts($fp"MAIL FROM: [email]adresse@adresse.de[/email]\r\n"); $line fgets($fp256);
                    
            fputs($fp"RCPT TO: ".$row['email']."\r\n"); $line fgets($fp256);
                    
            fputs($fp"DATA\r\n"); $line fgets($fp256);
                    
            fputs($fp"Subject: Beispielbetreff\r\n");
                    
            fputs($fp"Reply-To: [email]adresse@adresse.de[/email]\r\n\r\n");
                    
            fputs($fp$text."\r\n");
                    
            fputs($fp"\r\n.\r\n"); $line fgets($fp256);
                            
                    
            sleep(5); // wieso sleep ???
                
            }
            fputs($fp"QUIT"); $line fgets($fp256); 
            und wofür das sleep in der Schleife ?
            ist ja kein Wunder, das es so lange dauert
            TBT

            Die zwei wichtigsten Regeln für eine berufliche Karriere:
            1. Verrate niemals alles was du weißt!


            PHP 2 AllPatrizier II Browsergame

            Kommentar


            • #7
              @TBT:

              Die Vermutung war lediglich, dass z.B. 50 GMX-Adressen hintereinander in der Tabelle stehen könnten. Ich weiß doch nicht, ob der GMX-Mailserver in der Lage ist, 50 eMails in der kurzen Zeit problemlos hintereinander zu verarbeiten. Darum die 5 Sekunden. Danke dennoch für Deinen Tipp.

              Kommentar


              • #8
                Bau mal den fclose() in die Schleife mit ein, kann ja sein, dass Du hier auf einen timeout aufläufst.

                Kommentar


                • #9
                  Im Bezug auf die SMTP-Kommunikation?

                  Kommentar


                  • #10
                    Ja und andererseits machst Du immer einen fsockopen() ohne die Ressource wieder durch einen fclose freizugeben.

                    Kommentar


                    • #11
                      Ich tu's nie wieder. *schwör*

                      Aber würde ich nicht ständig eine Pause erzeugen, wenn ich fclose() INNERHALB der while-Schleife ausführe? Dann dauert es ja wieder ewig.

                      Kommentar


                      • #12
                        fclose gehört nach der Zeile,
                        wo du das WUIT an den Server schickst
                        TBT

                        Die zwei wichtigsten Regeln für eine berufliche Karriere:
                        1. Verrate niemals alles was du weißt!


                        PHP 2 AllPatrizier II Browsergame

                        Kommentar


                        • #13
                          WUIT?

                          Kommentar


                          • #14
                            QUIT


                            Tipfehler
                            TBT

                            Die zwei wichtigsten Regeln für eine berufliche Karriere:
                            1. Verrate niemals alles was du weißt!


                            PHP 2 AllPatrizier II Browsergame

                            Kommentar


                            • #15
                              Das ist bei mir mittlerweile so. Ich frage lieber zweimal nach.

                              Kommentar

                              Lädt...
                              X