Ungewollter Abbruch der Abarbeitung

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

  • Ungewollter Abbruch der Abarbeitung

    Hi!

    Ich habe ein Skript geschrieben, welches Daten per XML (fread) empfängt und diese auswertet. Es wird immer ein Datensatz mit einem Ergebnis bzw. einem Set aus 10 Ergebnissen geholt.
    Insgesamt hole ich auf diese Weise etwa 1000 einzelne Datensätze und 150 Datensätze zu je 10 Ergebnissen.
    Leider bricht das Skript bei der Abarbeitung der letzten Datensätze (also die 150) irgendwann wortlos ab. Reduziere ich deren Zahl auf 100, läuft das Script durch. Genauso könnte ich die 150 Datensätze in Ihrer Zahl belassen und dafür die 1000 einzelnen Datensätze, sagen wir mal um 100 Stück reduzieren...auch dann läuft das Script (idR.) durch.
    Es kommt auch hier schon mal zu einem Abbruch, aber äußerst selten...
    Ich setze zu beginn jedes Schleifendurchlaufs set_time_limit (600); wodurch die damit gesetzten 10 Minuten doch ab dem Zeitpunkt des "set_time_limit (600);" gelten müssten, oder?

    Die Abarbeitung des gesamten Scripts (mit auf 100 reduzierte 10er Datensätze) dauert ca. 620 Sekunden...mal 60 Sekunden weniger, mal 60 Sekunden mehr...je nachdem wie schnell der "Partnerserver" mir die Daten liefert.

    Was kann der Grund für diesen Abbruch sein und was kann ich dagegen tun?

    Gruß,
    Gerti

  • #2
    was bekommst du für ne fehlermeldung?

    kannst du nicht erst alle daten holen und dann mit dem auswerten anfangen?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Hallo!
      Mach doch 'mal set_time_limit aus der Schleife 'raus
      und setz' es 1x für die ganze Seite an den Anfang vom Script.

      Kommentar


      • #4
        Kommt außerhalb nach der Schleife noch eine Ausgabe? So kannst du testen ob es nicht am Zeitlimit liegt.

        Kommentar


        • #5
          Hi!

          Fehlermeldung bekomme ich gar keine...
          Die Ausgabe auf dem Browser bleibt einfach stehen...
          Ich muß leider "holen" und "auswerten" immer direkt kombinieren, sonst wäre der Aufwand viel zu hoch...

          Ich habe set_time_limit jetzt mal aus den Schleifen herausgenommen und an den Anfang gesetzt, es bleibt trotzdem einfach stehen...immer ungefähr an der gleichen Position...aber halt nicht immer an exakt der gleichen Position...
          Es wird nach jedem Durchlauf der Schleife ein "." ausgegeben, damit ich den "Vortschritt" sehen kann und irgendwann stoppt die Ausgabe halt einfach. Das "Windowssymbol" im Browser dreht dann auch nicht weiter...genauso, als wäre die Seite vollständig geladen worden.

          Ich habe jetzt noch ein ignore_user_abort(); an den Anfang des Skriptes gesetzt um eventuell ein TimeOut des Browsers abzufangen, hilft aber auch nichts :-(

          Gruß,
          Gerti

          Kommentar


          • #6
            Hallo!
            Sieht leider aus als ob es hier nicht weiter geht.

            Kannst Du das Problem irgentwie einschränken bzw. mehr Informationen herausbekommen?
            Z.B. die Verarbeitung ausklammern?
            Dann ein sleep statt der Verarbeitung 'rein für den Fall das es doch noch ein Timeout-Problem ist?
            Bleibt das script immer an der gleichen PHP-Zeile hängen?
            Irgendwas Minimiertes zum hier posten?

            Kommentar


            • #7
              Hi!

              Das Skript besteht aus ca. 1200 Zeilen Code (ohne Kommentare) und im Grunde aus 4 Teilbereichen.

              Bereich 1 vergleicht einzelne hinterlegte Artikel inkl. Preis über eine XML-Schnittstelle mit dem aktuellen Preis des Artikels um herauszufinden ob dieser billiger oder teurer wurde.
              Bereich 2 macht im Grunde genau das gleiche...wie Bereich 1
              Bereich 3 ließt dann vorgefertigte "Toplisten" per XML ein und vergleicht auch hier die Preise mit lokal abgespeicherten Preisen...
              Bereich 4 erzeugt dann aus den Ergebnissen von Bereich 1 bis 3 entsprechende Dateien, die zur Anzeige der Ergebnisse benötigt werden.

              Die Bereiche 1 bis 3 holen dabei per fread die XML Dateien, die ich anschließend parse und die Daten verarbeite.

              So wie es aussieht, bleibt die Abarbeitung immer irgendwo in einem solchen Abschnitt stehen:
              ---
              if ((($z/10) == ((int) ($z/10))) && $debug != "1") echo "[".$z."0]";
              elseif ($debug != "1") echo ".";
              flush();
              $xml_parser = xml_parser_create();
              // use case-folding so we are sure to find the tag in $map_array
              xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
              xml_set_element_handler($xml_parser, "NextstartElement", "NextendElement");
              xml_set_character_data_handler($xml_parser, "NextcharacterData");
              $get=0;
              $tries=0;
              while ($get == 0 && $tries < 50)
              {
              if ($fp = fopen($file, "r")) $get = 1;
              else $tries++;
              }
              if ($tries == 50) $error++;
              if ($debug == "1") echo "<br>Verbindungsversuche: ".($tries+1)."<br>";
              while ($data = fread($fp, 20000)) {
              if (!xml_parse($xml_parser, $data, feof($fp))) {
              echo "Error";
              $z=20;
              }
              }
              xml_parser_free($xml_parser);
              $z++;
              ---

              Unter o.g. Bedingungen (also 1000 einzelne Datensätze und 150 Datensätze zu je 10 Ergebnissen) bleibt das Skript definitiv im dritten Bereich irgendwann "wortlos" stehen. Der Codeausschnitt ist aus diesem dritten Teil. Reduziere ich aber den Wert der Datensätze zu je 10 Ergebnissen auf 100, dann läuft das Skript durch.
              Teilweise bleibt die "Abarbeitung" aber auch schon mal in Bereich 1 oder Bereich 2 stehen, ohne das man einen Grund dafür erkennen könnte. Mache ich dann einen Reload, kann es sein, daß es mal an einer anderen Stelle hängen bleibt oder auch problemlos durchläuft.

              Gruß,
              Gerti

              Kommentar


              • #8
                fclose fehlt. Kommt das später??

                Kommentar


                • #9
                  Hi!

                  Das scheint es gewesen zu sein...
                  Die Artikelanzahl im ersten Teil hatte sich zwar etwas reduziert, aber vermutlich nicht in dem Maße, daß es deswegen funktioniert hätte.

                  Man sollte wirklich keinen code per copy und paste aus dem PHP Handbuch kopieren :-) Da fehlt das fclose nämlich auch...und selber findet man solche Fehler ja eigentlich nie...

                  Was genau war aber nun die Ursache für den "wortlosen" Abbruch?
                  Zu viele Sockets?

                  Da mir mal wieder hervorragend geholfen werden konnte, sollt Ihr natürlich auch wissen, um was es bei diesem Projekt überhaupt geht...sofern mir die kleine "Eigenwerbung" gestattet ist.

                  Für alle, die häufiger bei Amazon bestellen, könnte das durchaus interessant sein...

                  http://preischecker.gerti.de

                  Nochmals vielen Dank für den "anscheinend entscheidenden Tip"...hoffen wir mal, dass es jetzt immer ohne Unterbrechung läuft...morgen früh weiß ich mehr...

                  Gruß,
                  Gerti

                  Kommentar


                  • #10
                    Hi!

                    Schade, war es doch nicht...
                    Habe den dritten Abschnitt jetzt mal von 1500 auf 2500 erhöht und dann bleibt er wieder einfach stehen...

                    Ich bin langsam echt am verzweifeln...

                    Gruß,
                    Gerti

                    Kommentar


                    • #11
                      diese XML-Datei, ist sie ein Datenbankdump? Wenn ja, dann importiere die Datei zuerst in die DB, dann kannst du bequem darauf zugreifen.

                      Kommentar


                      • #12
                        Hi!

                        Ich habe leider keine Datenbank bei meinem Webspace zur Verfügung und da das Projekt im Grunde mal gerade "die laufenden Kosten" deckt, ist in naher Zukunft auch nicht damit zu rechnen.

                        Gruß,
                        Gerti

                        Kommentar


                        • #13
                          Hallo,

                          also ich hab scheinbar exakt das selbe Problem. Ich hab ein Script, dass sich mit mehreren Datenbanken verbindet und von diesen ein Dumpfile erstellt. Dieses File wird ín einen speziellen Ordner gespeichert.

                          Das Script hört einfach irgendwann auf zu arbeiten. Die ersten Datenbanken werden erfolgreich gedumpt, wenn ich weniger datenbanken mit einbeziehe, dann funktionierts. Ab einer gewissen Anzahl bricht das Script ab, aber auch an scheinbar willkürlichen Stellen.

                          Alle Datenbankverbindungen und die Dateien werden jedesmal ordnungsgemäß geschlossen.

                          Folgende Parameter habe ich am Anfang des Scripts gesetzt:
                          set_time_limit(3600);

                          Ich hab schon alle möglichen Sachen versucht, aber nichts finden können.

                          phpinfo liefert folgendes:

                          memory_limit = 40M
                          max_execution_time = 50000
                          post_max_size = 8M

                          Hoffe, jemand weiß wie man dieses kuriose Phänomen auflöst.

                          Viele Grüße,
                          Zuletzt geändert von admin; 02.09.2010, 11:09.

                          Kommentar


                          • #14
                            Hi!

                            Nutzt Du die eregi Funktion in Deinem Script?
                            Irgendwie hängt es bei mir damit zusammen...
                            Ändere ich eregi in ereg, dann läuft das Script deutlich weiter...

                            Gruß,
                            Gerti

                            Kommentar


                            • #15
                              Hi,

                              ich hab eregi nur in einer kleinen Funktion stehen, die aber nicht verwendet wird. Auch wenn ich eregi durch ereg ersetze, tritt der Fehler weiterhin auf.

                              Grüße,
                              Fabian

                              Kommentar

                              Lädt...
                              X