PHP cURL timeout?!

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

  • #16
    Das ist nicht dein realer Code!

    Kommentar


    • #17
      wieso ist das nicht mein realer code?

      Kommentar


      • #18
        Weil du dich in einem Objektkontext befindest (das sagt mir $this->sleep) und deswegen die Funktion verarbeiten() nicht an das CURL-Ergebnis kommt. Das liegt nämlich in einer lokalen Variable $string in der Methode, wo der CURL-Aufruf stattfindet. Wenn das wirklich eins zu eins dein Code ist, dann erkläre mal bitte, was verarbeiten() macht!

        Kommentar


        • #19
          du hast vollkommen recht.
          das ganze ist aus einer klasse

          das ganze ist ein ausschnitt einer funktion.
          verarbeiten war pseudocode, stimmt. da das, was mit dme string gemacht ist, viel zu viel code hier wäre. das ganze wird gefiltert, bisschen verändert und dann per insert into in ne db geschrieben.

          das remission dekrementiert den counter und setzt einige andere variablen, sodass innerhalb der schleife der request wiederholt wird

          entschuldigt!

          Kommentar


          • #20
            Leider kann man dir nicht helfen, weil du Informationen zurück hältst. Dein Code besteht im Wesentlichen aus
            PHP-Code:
            $string curl_exec(...);
            if (
            $string === FALSE) {
                
            remission();
            } else {
                
            verarbeiten();

            und deine einzige Aussage dazu ist "leider verschwinden manche requests".

            Unter "Request" verstehst du offenbar die Ausführung von curl_exec(). Aber was heißt "verschwinden"? Gibt es eine Differenz zwischen der Anzahl der Ausführungen von curl_exec() und der Summe der Ausführungen von remission() und verarbeiten()? Anders ausgedrückt: Willst du behaupten, dass nach curl_exec() manchmal weder if noch else ausgeführt wird?!?

            Kommentar


            • #21
              du weißt selbst, dass das eigentlich nicht sein kann .. deine Abfrage mit
              Code:
              if ([COLOR=#000000][COLOR=#0000cc]$string [/COLOR][COLOR=#006600]=== [/COLOR][COLOR=#0000cc]FALSE) {
              [/COLOR][/COLOR]
              [COLOR=#000000][COLOR=#0000cc]

              ist absolut eindeutig .... es kann natürlich sein, dass dass einige deiner Anfragen IMMER im remission - Zweig landen. Dort wird die Schleifenvariablein incrementiert - und irgendwann wird dann die Schleife abgebrochen, ohne dass die betreffenden Hosts jemals antworten - Das wird wohl passieren, in unserm tollen Internet .. einzelne Rechner sind immer mal wieder nicht erreichbar
              [/COLOR][/COLOR]
              Zuletzt geändert von eagle275; 30.06.2010, 07:28.
              [font=Verdana]
              Wer LESEN kann, ist klar im Vorteil!
              [/font]

              Kommentar


              • #22
                hallo,
                okay, jetzt werde ich es ganz genau machen. mein problem ist, dass die verarbeitung von $string so umfangreich ist. deshalb habe viel gekürzt, weshalb es wohl umstaendlich wird.

                also, jetzt ganz genau:
                es handelt sich um die klasse abc. im konstruktor wird dann jeweils alles festgelegt, was die objektfunktionen brauchen ($this->..)

                der ausschnitt des codes ist aus der "main" funktion. diese wird nach dem erzeugen des objekts gerufen. dabei wird die schleife ($num) über $argv gesteuert. (kommandozeile)

                jetzt wird genau das ausgefuehrt:

                PHP-Code:

                while($num<$this->num){ //durchlauflaenge wird definiert $num->argv
                            
                         
                $cur_u getURL(); //diese funktion liefert die url, die besucht wird
                   // ist auch etwas umfangreicher, zum verstaendnis reicht es aber wohl  so
                        
                            
                $ch curl_init();  //hier werden die cURL "executed"
                            
                curl_setopt($chCURLOPT_URL$cur_u); 
                            
                curl_setopt($chCURLOPT_HEADER1);
                            
                curl_setopt($chCURLOPT_USERAGENT$this->user_agent); 
                            
                curl_setopt($chCURLOPT_RETURNTRANSFER1);
                            
                curl_setopt($chCURLOPT_TIMEOUT$this->timeout);
                            
                curl_setopt($chCURLOPT_COOKIEJAR,$this->cookie_file);
                            
                curl_setopt($chCURLOPT_COOKIEFILE,$this->cookie_file);
                            
                curl_setopt($chCURLOPT_FRESH_CONNECT1); 
                            
                curl_setopt($chCURLOPT_FORBID_REUSE1); 
                            
                curl_setopt($chCURLOPT_FOLLOWLOCATION1);
                            
                curl_setopt($chCURLOPT_NOPROGRESS0);
                            
                curl_setopt($chCURLOPT_BUFFERSIZE9000);
                            
                $string curl_exec($ch);

                            if(
                $string === FALSE){ //wird auf fehler ueberprueft
                                
                print "error"
                                
                remission(); setzt den url "maker" um eins zuruecksodass neu gerufen wird
                            
                }
                            else{
                                
                verarbeiten($string); hier wird der string dann weiterverarbeitet
                                
                print "fertig und ok";
                                
                                    
                $num++; //schleife
                                
                }
                                print 
                "sent request to ".$num;
                                
                curl_close($ch);
                                
                usleep($this->sleep); 
                            } 
                so, das ist es. die ausgabe sieht nun so aus (wir gehen von 10 requests aus)
                fertig und ok sent request to....
                fertig und ok sent request to....
                error sent request to...
                fertig und ok sent request to....
                sent request to....

                ...
                und genau das vorletze ist das problem: hier wird zwar gesagt, dass der request gesendet wurde, allerdings habe ich keine indikator was nun damit passiert ist. obwohl doch eine der beiden moeglichkeiten (verarbeiten oder remission) zutreffen MUSS.

                ich hoffe nun ist es klar

                danke!
                Zuletzt geändert von svr; 30.06.2010, 12:41.

                Kommentar


                • #23
                  Wenn deine Schleife nicht mehr wiederholt wird (letzter Durchlauf), kann danach ja nichts mehr kommen. Sinnvoller wäre es, diese Ausgabe vor dem aktuellen Request zu tätigen und nicht danach für den nächsten, weil ja eben nicht unbedingt noch einer kommen muss. Error by Design.

                  Edit: vergiss das Geschriebene, ich merk gerade, dass ich da was verdreht hab.
                  Zuletzt geändert von AmicaNoctis; 30.06.2010, 14:08.
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #24
                    Deine Art den Code für uns zu vereinfachen macht es leider nur komplizierter.

                    Dein Problem: Du erhältst u.a. die Ausgabe "sent request to …" ohne dass zuvor "error" oder "ok" ausgegeben wurde.

                    Dein Code entspricht diesem Pseudocode:
                    PHP-Code:
                    while ($num $this->num) {
                        if (
                    rand(0,1)) {
                            print 
                    "error";
                        }
                        else {
                            print 
                    "ok";
                            
                    $num++;
                        }
                        print 
                    "sent request to ".$num;

                    Jetzt siehst du selbst, dass dieser Code dein Problem überhaupt nicht verursachen kann. Da ich deine Ausgabe nicht anzweifle, muss es also an deinen "Vereinfachungen" liegen.

                    Häng doch einfach mal das ganze Script als Attachment an deinen nächsten Beitrag. Sonst kommen wir hier nicht zu Potte.

                    Kommentar


                    • #25
                      hallo,
                      ah, jetzt habe ich es herausgefunden: tatsächlich lag es nicht an cURL, es lag an einer regular expression, der ein U Modifier fehlte.
                      ich habe bewusst nicht den ganzen code gepostet, da es über 1700 zeilen sind.


                      vielen dank für eure hilfe!

                      Kommentar


                      • #26
                        Zitat von svr Beitrag anzeigen
                        da es über 1700 zeilen sind.
                        Aua, wie will man das denn noch debuggen? Mal ein paar Such-Stichworte als Anregungen für die Verbesserung deines Programmierstils, um sowas beim nächsten Mal zu vermeiden: OOP, Code Re-use, Unit Tests, Behavior-driven Development, Design Patterns, Inversion of Control.
                        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                        Super, danke!
                        [/COLOR]

                        Kommentar


                        • #27
                          Zitat von AmicaNoctis Beitrag anzeigen
                          Aua, wie will man das denn noch debuggen? Mal ein paar Such-Stichworte als Anregungen für die Verbesserung deines Programmierstils, um sowas beim nächsten Mal zu vermeiden: OOP, Code Re-use, Unit Tests, Behavior-driven Development, Design Patterns, Inversion of Control.
                          klar, bin mir bewusst.

                          vielen dank!

                          Kommentar

                          Lädt...
                          X