2009-09-13 21 views
7

Ich verwende CURL, um eine Verbindung zu mehreren XML-Feeds herzustellen und sie beim Laden der Seite zu verarbeiten. Leider reagiert jede Seite ab und zu nicht mehr und mein Skript wird ebenfalls zum Stillstand kommen. Hier ist ein Beispiel für den Code, mit dem ich arbeite. Ich habe das Timeout auf 1 gesetzt, aber das scheint nicht zu funktionieren. Ich habe dann das Timeout auf 0,0001 gesetzt, nur um Dinge heute zu testen, und es hat immer noch XML-Feeds eingezogen. Habt ihr irgendwelche Ideen, wie man curl zur Zeitüberschreitung zwingt, wenn ein Skript ewig dauert?curl connect timeout funktioniert nicht

foreach($urls as $k => $v) { 
    $curl[$k] = curl_init(); 
    curl_setopt($curl[$k], CURLOPT_URL, $v); 
    curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl[$k], CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl[$k],CURLOPT_CONNECTTIMEOUT, 1); 

Antwort

0

Sehen Sie den Unterschied zwischen CURLOPT_CONNECTTIMEOUT und CURLOPT_TIMEOUT

+1

Sorry, aber diese Antwort gibt keine nützlichen Informationen. Natürlich sind das verschiedene Optionen und natürlich müssen wir den Unterschied sehen :) – DarkSide

37

Es gibt zwei verschiedene Timeouts mit curl - siehe curl_setopt manual's page:

CURLOPT_CONNECTTIMEOUT
Die Zahl von Sekunden zu warten, während auf versuchen connect . Verwenden Sie 0, um unbegrenzt zu warten.

Und:

CURLOPT_TIMEOUT
Die maximale Anzahl Sekunden cURL Funktionen ausführen zu können.

Beide haben eine "Millisekunde" Version: CURLOPT_CONNECTTIMEOUT_MS und CURLOPT_TIMEOUT_MS sind.


In Ihrem Fall möchten Sie möglicherweise auch die zweite konfigurieren: Was scheint Zeit zu nehmen ist nicht die Verbindung, sondern die Konstruktion des Feeds auf der Serverseite.

+0

Vielen Dank das war extrem hilfreich. Ich versuche zu testen, ob es funktioniert und um dies zu tun, setze ich das Timeout auf 1 wie im folgenden Code. Ich analysiere xmls mit 50-100 Elementen, also würde ich mir vorstellen, dass es mehr als eine Millisekunde dauern würde. Ich erwartete keine Ergebnisse, aber stattdessen kehrte alles wie normal zurück. \t curl_setopt ($ curl [$ k], CURLOPT_TIMEOUT_MS, 1); Fehle ich etwas? Vielen Dank Pascal Russ –

+0

wirklich schönes Beispiel dort Pascal –

0

Ich benutze Curl-Bibliothek zum Herunterladen einer Datei von Apache Server. downloadFileWithCurlLibrary-Funktion hat zwei Eingänge. FileUrl ist die Datei wird den Formularserver herunterladen. Beispiel: www.abc.com/myfile.doc. locFile ist der Verzeichnis- und Dateiname, den Sie speichern möchten. Beispiel: /home/projectx/myfile.doc.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <curl/curl.h> 

int downloadFileWithCurlLibrary(char *FileUrl,char *locFile) 
{ 
    char dlFile[1024]; 
    CURL *curl_handle; 
    FILE *pagefile; 


    memset(dlFile,0x0,sizeof(dlFile)); 
    /* Create URL */ 

    sprintf(dlFile,"%s",FileUrl); 

    curl_global_init(CURL_GLOBAL_ALL); 

    /* init the curl session */ 
    curl_handle = curl_easy_init(); 

    /* Set timeout 3 min = 3*60 sec here. */ 
    curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 1800); 

    /* set URL to get here */ 
    if (curl_easy_setopt(curl_handle, CURLOPT_URL, dlFile) != CURLE_OK) 
     return -1; 

    /* Switch on full protocol/debug output while testing */ 
    // if (curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L) != CURLE_OK) 
    // return -1; 

    /* disable progress meter, set to 0L to enable and disable debug output */ 
    if (curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L) != CURLE_OK) 
     return -1; 

    /* send all data to this function */ 
    if (curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data) != CURLE_OK) 
     return -1; 

    /* open the file */ 
    pagefile = fopen(locFile, "wb"); 
    if (pagefile) 
    { 

     /* write the page body to this file handle. CURLOPT_FILE is also known as 
      CURLOPT_WRITEDATA*/ 
     if (curl_easy_setopt(curl_handle, CURLOPT_FILE, pagefile) != CURLE_OK) 
      return -1; 

     /* get it! */ 
     if (curl_easy_perform(curl_handle) != 0) 
      return -1; 

     /* close the header file */ 
     fclose(pagefile); 
    } 
    else 
    { 
     return -1; 
    } 

    /* cleanup curl stuff */ 
    curl_easy_cleanup(curl_handle); 

    return 0; 
} 
+0

Sie würden wahrscheinlich Stimmen erhalten, wenn Sie dies mehr erklärt und tatsächlich zeigte eine Demonstration der Callback-Funktionen. –

+0

Wenn Timeout aufgetreten ist. Diese Funktion gibt -1 zurück. – omeraygor