curl und große Dateien

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

  • curl und große Dateien

    Hallo!

    Ich habe ein kleines Problem mit curl und großen Dateien. Ich steuere mit cUrl einen Web-Service an, der mit dann die entsprechende Datei zurückliefert. Wenn diese Datei allerdings eine gewisse Größe erreicht, macht der Server die Grätsche und ich kriege nur einen 500 zurück. Die Datei, die ich anspreche hat eine Größe von ca. 50 MB. Mit kleineren Dateien funktioniert das Script einwandfrei. Kann mir jemand einen Tipp geben, wie ich das evtl. besser machen kann? Meine PHP-Version ist die 5.3.1 auf einem IIS und hier ist mein Code:

    PHP-Code:

    //    Set-up Query URL
    //    -------------------------------------------------------------
    $url 'http://link/zum/webservice';

    //    Init the cURL Session
    //    -------------------------------------------------------------
    $session curl_init();
    curl_setopt($sessionCURLOPT_URL$url);
    curl_setopt($sessionCURLOPT_FAILONERROR1);
    curl_setopt($sessionCURLOPT_RETURNTRANSFER1);
    curl_setopt($sessionCURLOPT_BINARYTRANSFER1);
    curl_setopt($sessionCURLOPT_TIMEOUT6000);
    curl_setopt($sessionCURLOPT_USERPWD"username:password");
        
    //    Execute cURL Session
    //    -------------------------------------------------------------
    $result curl_exec($session); // run the whole process
        
    //    Check if cURL returns an error. If not print the result 
    //    to the screen
    //    -------------------------------------------------------------
    if(curl_errno($session) != 0){

        echo 
    '<pre>';
        
    print_r(curl_getinfo($session)); 
        echo 
    "\n\ncURL error number:" curl_errno($session); 
        echo 
    "\n\ncURL error:" curl_error($session); 
        echo 
    '</pre>';
        
    } else {
        
        
    header('Content-Type: ' $_GET['dFormat']);
        
    header('Content-Disposition: attachment; filename="' $_GET['dOriginalName'] . '"');
        echo 
    $result
    }
        
    curl_close($session); 
    mens agitat molem

  • #2
    Hallo,

    liegt dieser Webservice auf deinem Server oder gehört der jemand anderem? Das Problem ist jedenfalls nicht dein cURL-Zugriff, sondern der Server.

    Wenn du den Server (auch in deinem eigenen Interesse) schonen möchtest, kannst du ja mal probieren, ob er Ranges unterstützt. Trotzdem ist das nicht die Lösung und der Server sollte repariert werden, weil er sich nicht standardkonform verhält.

    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


    • #3
      Hallo!

      Das Problem ist gelöst. Das Problem war wohl, dass die Datei, die zurückkam, im Speicher abgelegt wurde und deswegen einfach zu dick war. Ich hab's jetz so gelöst, dass die Datei im Temp Verzeichnis abgelegt wird und dann ausgegeben wird. Dann geht's.

      Für alle die's interessiert:

      PHP-Code:
      //    Open temp file
      $tempFile fopen($_SERVER['TEMP'] . '/' $_GET['dOriginalName'], 'w');    


      //    Set-up Query URL
      //    -------------------------------------------------------------
      $url 'link/zum/webservice';

      //    Init the cURL Session
      //    -------------------------------------------------------------
      $session curl_init();
      curl_setopt($sessionCURLOPT_URL$url);
      curl_setopt($sessionCURLOPT_FAILONERROR1);
      curl_setopt($sessionCURLOPT_FILE$tempFile);
      curl_setopt($sessionCURLOPT_FOLLOWLOCATIONtrue);
      curl_setopt($sessionCURLOPT_BINARYTRANSFER1);
      curl_setopt($sessionCURLOPT_TIMEOUT6000);
      curl_setopt($sessionCURLOPT_USERPWD"user:password");
          
      //    Execute cURL Session
      //    -------------------------------------------------------------
      $result curl_exec($session); // run the whole process
          
      //    Check if cURL returns an error. If not print the result 
      //    to the screen
      //    -------------------------------------------------------------
      if(curl_errno($session) != 0){
          
          echo 
      '<pre>';
          
      print_r(curl_getinfo($session)); 
          echo 
      "\n\ncURL error number:" curl_errno($session); 
          echo 
      "\n\ncURL error:" curl_error($session); 
          echo 
      '</pre>';
          
      } else {
          
          
      header('Content-Type: ' $_GET['dFormat']);
          
      header('Content-Disposition: attachment; filename="' $_GET['dOriginalName'] . '"');
          
      readfile($_SERVER['TEMP'] . '\\' $_GET['dOriginalName']); 
      }

      fclose($tempFile);
      curl_close($session); 

      if(
      is_file($_SERVER['TEMP'] . '\\' $_GET['dOriginalName'])){
          
      unlink($_SERVER['TEMP'] . '\\' $_GET['dOriginalName']);

      Zuletzt geändert von yezariel; 12.02.2010, 09:27. Grund: Fehler
      mens agitat molem

      Kommentar


      • #4
        Das hättest du aber dazusagen können, dass du mit "der Server" nicht den fremden, sondern deinen meinst.

        In deinem Szenario war nämlich dein Server primär als Client tätig.
        [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


        • #5
          Hallo nochmal.

          Ok, du hast natürlich recht, sorry.

          Das nächste mal werde ich mich deutlicher ausdrücken.

          Gruß,

          Bernd
          Zuletzt geändert von yezariel; 12.02.2010, 16:25. Grund: fehler
          mens agitat molem

          Kommentar

          Lädt...
          X