curl_multi langsam

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

  • curl_multi langsam

    Hallo zusammen

    ich experimentiere gerade mit Curl Multi herum um parallel Abfragen zu senden.
    Ich habe einen eigenen Server und habe leider den Fall dass Multi Curl langsamer ist als der normale Aufruf.

    Aber zuerst mal der Aufbau.....

    Um das zu testet, habe ich das Script von PHP: curl_multi_add_handle - Manual
    genommen und auf 30 Urls erweitert. Ich hab da Wikipedia, Amazon usw als Domains genommen.

    Hier messe ich nun die Zeit. Danach mach ich das gleich nochmal, bloß mit normalen CURL Aufbau und vergleiche die Zeiten:

    PHP-Code:
    function curlopen($url) {
        
    $ref " ";
        
    $ch curl_init();
        
    $user_agent "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";

        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_USERAGENT$user_agent);
        
    curl_setopt($chCURLOPT_TIMEOUT10);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT10);
        
    curl_setopt($chCURLOPT_HEADER0);
        if (
    ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
            
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        }
        
    curl_setopt($chCURLOPT_REFERER$ref);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);

        
    curl_setopt($chCURLOPT_INTERFACE$_SERVER['HTTP_HOST']);//select IP


        
    $result curl_exec ($ch);
        
    curl_close ($ch);
        return 
    $result;

    Hier schauen die Zeiten auch Top aus:

    HTML-Code:
    1260810149.7 : ---------- : ----------START MULTI
    
    1260810155.89 : ---------- : ----------ENDE
    
    1260810158.89 : ---------- : ----------START SINGLE
    
    1260810180.45 : ---------- : ----------ENDE 
    Sprich normales Curl 22 Sek und Multi nur 6 Sekunden. Das hab ich ja auch erwartet.

    Wenn ich nun aber die Domains tausche und 30 mal die gleiche Domain auf meinem Server abfrage, ist die parallel Abfrage langsam als die sequenzielle.

    HTML-Code:
    1260812134.89 : ---------- : ----------START MULTI
    
    1260812138.98 : ---------- : ----------ENDE
    
    1260812141.98 : ---------- : ----------START SINGLE
    
    1260812143.96 : ---------- : ----------ENDE 
    Woran kann denn sowas liegen. Gibt es irgendwo ne Einstellung für Apache wieviele Anfragen er gleichzeitig machen kann, oder woran kann denn sowas noch liegen ?

    Danke schon mal im voraus

    Gruß Tom
    Spambot Falle
    Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

  • #2
    Zitat von JR-EWING Beitrag anzeigen
    Danach mach ich das gleich nochmal, bloß mit normalen CURL Aufbau und vergleiche die Zeiten
    Und damit dieser Versuchsaufbau sinnvoll sein kann, hast du natürlich schon ausgeschlossen, dass irgendwo (seitens cURL, PHP/Webserver, Zugangsprovider) Caching stattfindet?
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Also ich hab Root Rechte und den auch selber eingerichtet.

      Müsste er nicht bei beiden (multi und normal) cachen ?

      es sind aber immer unterschiedliche Urls - also

      domain-a.de/1.html
      domain-a.de/2.html
      domain-a.de/3.html
      domain-a.de/4.html
      domain-a.de/5.html
      Spambot Falle
      Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

      Kommentar


      • #4
        Zitat von JR-EWING Beitrag anzeigen
        es sind aber immer unterschiedliche Urls
        Unterschiedlich zwischen was - zwei den beiden Testreihen, die du aufgebaut hast und nacheinander durchführst?
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          ich hab das jetzt mal umgedreht.

          Vorher
          PHP-Code:
          $test =  curlopen'http://188.40.xx.65/1.html');
          $test =  curlopen'http://188.40.xx.65/2.html');
          $test =  curlopen'http://188.40.xx.65/3.html');
          $test =  curlopen'http://188.40.xx.65/4.html');
          $test =  curlopen'http://188.40.xx.65/5.html');
          ....
          curl_setopt($ch1CURLOPT_URL'http://188.40.xx.65/1.html');
          curl_setopt($ch2CURLOPT_URL'http://188.40.xx.65/2.html');
          curl_setopt($ch3CURLOPT_URL'http://188.40.xx.65/3.html');
          curl_setopt($ch4CURLOPT_URL'http://188.40.xx.65/4.html');
          curl_setopt($ch5CURLOPT_URL'http://188.40.xx.65/5.html'); 
          Nachher

          PHP-Code:
          curl_setopt($ch1CURLOPT_URL'http://188.40.xx.65/1.html');
          curl_setopt($ch2CURLOPT_URL'http://188.40.xx.65/2.html');
          curl_setopt($ch3CURLOPT_URL'http://188.40.xx.65/3.html');
          curl_setopt($ch4CURLOPT_URL'http://188.40.xx.65/4.html');
          curl_setopt($ch5CURLOPT_URL'http://188.40.xx.65/5.html');
          ...
          $test =  curlopen'http://188.40.xx.65/1.html');
          $test =  curlopen'http://188.40.xx.65/2.html');
          $test =  curlopen'http://188.40.xx.65/3.html');
          $test =  curlopen'http://188.40.xx.65/4.html');
          $test =  curlopen'http://188.40.xx.65/5.html'); 
          ist aber egal wie rum - Multi ist langsamer

          Wie gesagt bei anderen Urls also Google, Amazon, Ebay usw klappt es ja

          Nur bei meiner Domain, ( für die ich aber das ganze leider brauche) die auf meinen Server liegt, leider nicht :-(
          Spambot Falle
          Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

          Kommentar


          • #6
            Zitat von JR-EWING Beitrag anzeigen
            ist aber egal wie rum - Multi ist langsamer
            Gut - das schliesst zumindest schon mal Caching als ersten Hauptverdächtigen aus.

            Nur bei meiner Domain, ( für die ich aber das ganze leider brauche) die auf meinen Server liegt, leider nicht :-(
            Dann würde ich erst mal schauen, ob dein Server Requests mit einer Content-Length-Angabe ausliefert. Die ist nämlich notwendig, um mehrere HTTP-Requests über eine (aufrechterhaltene) Verbindung abwickeln zu können.

            Wenn er das nicht tut, dann hat cURL auch mit multi-Funktionalität keine andere Möglichkeit, als für jede Ressource eine neue Verbindung aufzubauen.
            Und dass das schnell in irgendwelche Limits läuft, ist nachvollziehbar.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Sorry jetzt muss ich leider dumm fragen - du meinst sowas ?

              Code:
              HTTP/1.1 200 OK
              Date: Mon, 14 Dec 2009 19:44:52 GMT
              Server: Apache/2.2.9 (Debian)
                  PHP/5.2.6-1+lenny3 with Suhosin-Patch
                  mod_ssl/2.2.9 OpenSSL/0.9.8g
              X-Powered-By: PHP/5.2.6-1+lenny3
              Vary: Accept-Encoding
              Content-Length: 1
              also schaut so aus als würde mein Server das ausgeben. Ich hab jetzt auch mal die Anzahl der Anfragen auf 10 reduziert. Aber auch ohne Erfolg

              HTML-Code:
              1260820272.45 : ---------- : ----------START MULTI
              
              1260820275.37 : ---------- : ----------ENDE
              
              sleep(3)
              
              1260820278.37 : ---------- : ----------START SINGLE
              
              1260820278.85 : ---------- : ----------ENDE 
              Zuletzt geändert von AmicaNoctis; 14.12.2009, 20:56. Grund: Umbrüche gesponsert
              Spambot Falle
              Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

              Kommentar


              • #8
                hmmm ich hab jetzt das Script auch einmal auf einem anderen Server installiert.
                Dort geht Multi richtig schnell - so wie es sein sollte.

                Es scheint also wirklich ein Config Problem des Apache auf meinem Server zu sein.

                Also Cache und Script Fehler kann ich daher ausschließen.

                Gruß Tom
                Spambot Falle
                Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

                Kommentar


                • #9
                  Na dann schau dir mal an, wie viele parallele Connections dein APache erlaubt, wie viele permanente, etc.
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    habe den Fehler gefunden:

                    Es lag an Werten in der http.conf vom Apache

                    HTML-Code:
                    MaxRequestsPerChild      0
                    Neuer Wert
                    HTML-Code:
                    MaxRequestsPerChild      50
                    und schon läuft es wie gewünscht.

                    HTML-Code:
                    1260827895.35 : ---------- : ----------START MULTI
                    
                    1260827895.41 : ---------- : ----------ENDE
                    
                    1260827898.41 : ---------- : ----------START SINGLE
                    
                    1260827898.77 : ---------- : ----------ENDE 
                    wieder was gelernt....
                    Spambot Falle
                    Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

                    Kommentar


                    • #11
                      hm doch zu früh gefreut - war wohl ne Ausnahme
                      Spambot Falle
                      Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

                      Kommentar


                      • #12
                        Es kann sein, dass die CURL-Library das kaputtoptimiert. Normalerweise ist es teurer, eine neue Verbindung aufzubauen, als eine bestehende nochmal zu benutzen. Wenn du aber lokal arbeitest, könnte es sein, dass CURL merkt, dass es derselbe Server ist und daraufhin die bestehende Verbindung weiterbenutzt, statt für jeden Request eine neue aufzubauen. Da dann die Requests seriell erfolgen, dauert das länger.

                        Du könntest versuchen, einen "Connection: close"-Header zu setzen, aber ob CURL das merkt und das Verhalten dadurch ändert, kann ich jetzt nicht sagen. Einen Versuch ist es jedenfalls wert.

                        Generell ist das Problem aber eher theoretischer Natur, denn im Normalfall wirst du ja eher fremde (und auch verschiedene) Server mit CURL ansprechen und da macht dann ein keep-alive wieder Sinn.

                        Gruß,

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


                        • #13
                          Ich hab leider wirklich das Problem, dass ich auf meinem Server bleibe :-(

                          Mit Connection Close meinst du jetzt in den normalen Curl Anweisungen - also sowas ?

                          PHP-Code:
                              $header "Connection: close \r\n\r\n";
                              
                          curl_setopt($chCURLOPT_CUSTOMREQUEST$header); 
                          das erzeugt mir jetzt ein Bad Request
                          Spambot Falle
                          Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

                          Kommentar


                          • #14
                            Connection ist ein Response Header, muss also vom Server gesetzt werden.

                            Wenn du auf lokale Ressourcen zugreifst, warum dann überhaupt CURL? Du hast doch das ganze Dateisystem vor deinen Füßen. Statt an der Nachbarwohnungstür zu klopfen, gehst du also lieber runter vor die Haustür und nutzt die Sprechanlage?

                            Edit:

                            Zitat von JR-EWING Beitrag anzeigen
                            PHP-Code:
                                $header "Connection: close \r\n\r\n";
                                
                            curl_setopt($chCURLOPT_CUSTOMREQUEST$header); 
                            das erzeugt mir jetzt ein Bad Request
                            Sollte es auch, mit CURLOPT_CUSTOMREQUEST kann man nur die Request-Methode setzen und nicht irgendwelche Header.
                            Zuletzt geändert von AmicaNoctis; 15.12.2009, 00:17.
                            [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


                            • #15
                              Das Script das ich parallel 30fach aufrufen möchte, dient als Proxy Script das bestimmte APIs aufruft. Zugriff auf die API hab ich nur von meiner Server IP. Aber so kann ich die Api auch von anderen IPs nutzen.

                              Connection ist ein Response Header, muss also vom Server gesetzt werden.
                              wie mach ich das ?
                              Spambot Falle
                              Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

                              Kommentar

                              Lädt...
                              X