PHP cURL timeout?!

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

  • PHP cURL timeout?!

    hallo liebe gemeinde
    ich habe ein kleines problem, wofür mir irgendwie die lösung nicht einleuchten mag.
    und zwar:
    ich setze jeweils in einer schleife so um die 100 http requests ab, der request übergibt den returned transfer an eine variable, die einigen zeichen entfernt und anschliessend mittels sql in eine datenbank geschrieben wird.

    es geht dabei darum, ein system zu entwickeln, womit ich lokal von meinem remote server einige daten auslesen kann und sozusagen ein "backup" wichtiger daten zu erhalten.
    klar kann man es anders lösen, darum geht es mir aber nicht.

    das problem ist nur, dass irgendwie manche requests einfach so untergehen. falls bei einem request was falsch laeuft sollte ja false zurückgegeben werden, wird aber nicht, das ganze geht einfach unter.
    habe je eine ausgabe if(request true) print "request nummer x erfolgreich"

    sieht dann meisten so aus: erfolgreich-> 1,2,3,4 plötzlich 8, 9,10,11,12,15

    ich denke ihr wisst was gemeint ist
    ich habe die manual mal gelesen, allerdings habe ich keine schlüssige antwort.
    ich habe als "lösungsversuch" mal probiert, einen sleep einzubauen. nach jedem request wird jetzt 2 sekunden geschlafen.

    danke für jede hilfe

  • #2
    Zitat von svr Beitrag anzeigen
    habe je eine ausgabe if(request true) print "request nummer x erfolgreich"

    sieht dann meisten so aus: erfolgreich-> 1,2,3,4 plötzlich 8, 9,10,11,12,15
    Wie auch immer diese eher obskure Abfrage in der Realität aussehen mag - wenn du nur den positiv-Fall behandelst und den Fehlerfall nicht, dann brauchst du dich auch nicht wundern, wenn fehlerhaft verlaufene Requests „einfach so untergehen“.

    Wie sieht denn deine Fehlerbehandlung aus, was fragst du ab und wie behandelst du es?
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      ich geben voll und ganz zu, dass ich den eintrag hier haette schoener gestalten koennen

      das ganze sieht natürlich so aus:

      if(curl_request) print "erfolgreich";
      if(!curl_request) print "nicht erfogreich"; // php-manual: curl gibt im fehlerfall false zurück

      trotzdem wird eben nicht dieses "nicht erfolgreich" ausgegeben, niemals.

      Kommentar


      • #4
        Zitat von svr Beitrag anzeigen
        trotzdem wird eben nicht dieses "nicht erfolgreich" ausgegeben, niemals.
        Vielleicht waren alle Requests „erfolgreich“ (im Sinne von HTTP) - aber die Gegenstelle hat nicht das geliefert, was du erwartet hast. Hast du das überprüft ...?


        Du wirst schon mehr Infos - brauchbare Infos - liefern müssen, wenn du Hilfe bei deinem Problem bekommen willst.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          hallo,
          also als erstes werde ich mal die curls posten
          sieht so aus

          PHP-Code:
                      $ch curl_init(); 
                      
          curl_setopt($chCURLOPT_URL$urlcurrent); 
                      
          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,'c.txt');
                      
          curl_setopt($chCURLOPT_COOKIEFILE,'c.txt');
                      
          curl_setopt($chCURLOPT_FRESH_CONNECT1); 
                      
          curl_setopt($chCURLOPT_FORBID_REUSE1); 
                      
          curl_setopt($chCURLOPT_FOLLOWLOCATION1);
                       
                      
          $string curl_exec($ch);

                      if(!
          $string){
                          print 
          "false";
                          
          remission();
                      } 
          als erstes fuehre ich in der schleife jeweils die requests aus, speichere das ganze in $string. danach wird uberprüft, was string zurückgibt, bei false sollte die funktion remission, die das ganze mit derselben url wiederholt, gerufen werden.

          im positiven fall wird der string weiterverarbeitet

          wie meinst du das mit "im sinne von http"
          wenn ein fehler auftritt sollte false zurückgegeben werden, falls alles glatt geht sollt mein stirng daten enthalten, wenigstens irgendwas
          ode rnicht?

          danke!
          Zuletzt geändert von svr; 24.06.2010, 20:29.

          Kommentar


          • #6
            Zitat von svr Beitrag anzeigen
            wenn ein fehler auftritt sollte false zurückgegeben werden,
            Prüfst du auf false? Nein.

            falls alles glatt geht sollt mein stirng daten enthalten, wenigstens irgendwas ode rnicht?
            Genau das herauszufinden, riet ich dir bereits.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Zitat von wahsaga Beitrag anzeigen
              Prüfst du auf false? Nein.
              ..!$string...
              prüft das etwa nicht?

              Zitat von wahsaga Beitrag anzeigen
              Genau das herauszufinden, riet ich dir bereits.
              falls ein string daten enthält sehe ich es, dnen ich geben curl infos uber datengroesse transferzeit etc aus, plus substring.

              auf der kommandozeile natürlich. dann muesste ich doch wenigstens sehen, ob die entsprechende nummer leer ist.
              es kommt aber gar kein output!
              substring plus das andere zeug habe ich ja nicht zum spass gemacht, es ist also nicht so, dass ich es nicht versucht hätte.

              Kommentar


              • #8
                öhm .-. auch wenn das Amica und die annern hier vielleicht schöner erklären

                if (!$String) prüft nicht auf FALSE - , es prüft ob die Variable überhaupt existiert - die funktion antwortet jedoch bei Verbindungsfehler mit FALSE . das dann in der Variablen drinsteht ... sie existiert also

                correctamente sollte das wohl eher
                Code:
                if ($String === FALSE ) {
                   echo "mecker HTTP-request keine Antwort <br>";
                }
                else {
                ....
                tu halt was du machen wolltest, wenn die Anfrage erfolgreich war 
                }
                Zuletzt geändert von eagle275; 24.06.2010, 22:36.
                [font=Verdana]
                Wer LESEN kann, ist klar im Vorteil!
                [/font]

                Kommentar


                • #9
                  !$var ergibt immer dann true, wenn für $var eine der folgenden Bedingungen zutrifft:
                  • $var ist undefiniert (vorher kommt eine Notice)
                  • $var ist null
                  • $var ist false
                  • $var ist 0
                  • $var ist ein leerer String
                  • $var ist ein String der nur die Ziffer 0 enthält, z. B. '0' oder "0"
                  • $var ist ein leeres Array


                  Im Grunde genommen wird der Wert erst zu int und danach zu bool gecastet. Das Ergebnis wird schließlich negiert (vgl. empty()).
                  [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


                  • #10
                    super erklärung, danke
                    mache mich ans werk und schaue ob alles klar geht

                    Kommentar


                    • #11
                      hi,
                      muss noch einmal fragen

                      habe jetzt das ganze so gelöst if($string === FALSE){remission();}else{save();}

                      das funktioniert schon ganz gut, nur leider verschwinden manche requests immernoch.
                      habe eine statistik gemacht, so in etwa 5-10% sind einfach weg.

                      hat jemand einen rat?
                      danke

                      Kommentar


                      • #12
                        Wie sieht dein aktueller Code aus?

                        Kommentar


                        • #13
                          PHP-Code:
                          while($int<$absoluteAnzahl){
                                      
                          $int++;
                                      
                          // hier wird die url generiert ->$u_curl
                                  
                                      
                          $ch curl_init(); 
                                      
                          curl_setopt($chCURLOPT_URL$u_cur); 
                                      
                          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);
                                      
                          $string curl_exec($ch);

                                      if(
                          $string === FALSE){
                          print 
                          "error";
                                       
                          remission(); //die funktion ruft das ganze nochmal auf
                                      
                          }
                                      else{
                          verarbeiten(); // hier wird weiter verarbeitet
                                            
                          }
                                          
                                         
                                          
                          usleep($this->sleep);
                                          
                                          
                          curl_close($ch); 
                                      } 
                          sorry für die schlechte formatierung

                          Kommentar


                          • #14
                            keiner mehr??

                            Kommentar


                            • #15
                              Zitat von svr Beitrag anzeigen
                              keiner mehr??
                              OffTopic:
                              Du weißt, was um 16 Uhr passiert? Schau mal in deine Fehrnsehzeitung.


                              Peter
                              Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                              Meine Seite

                              Kommentar

                              Lädt...
                              X