тайм-аут соединения не работает - PullRequest
7 голосов
/ 13 сентября 2009

Я использую CURL для подключения к нескольким каналам XML и обработки их при загрузке страницы. К сожалению, время от времени страница не будет отзывчивой, и мой сценарий также будет зависать. Вот пример кода, с которым я работаю. Я установил тайм-аут на 1, но это не работает. Затем я установил тайм-аут на 0,0001, чтобы проверить все сегодня, и он все еще использует каналы XML. Ребята, есть ли у вас какие-либо идеи о том, как заставить свернуться время, когда сценарий работает вечно.

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); 

Ответы [ 3 ]

38 голосов
/ 13 сентября 2009

Существует два разных времени ожидания с curl - см. curl_setopt страницу руководства :

CURLOPT_CONNECTTIMEOUT
Номер секунд ожидания при попытке подключения. Используйте 0, чтобы ждать бесконечно.

А:

CURLOPT_TIMEOUT
Максимальное количество секунд, чтобы позволить функциям cURL выполнять.

Они оба имеют «миллисекундную» версию: CURLOPT_CONNECTTIMEOUT_MS и CURLOPT_TIMEOUT_MS соответственно.


В вашем случае вам может потребоваться настроить и второй: кажется, что требуется время не на соединение, а на создание канала на стороне сервера.

1 голос
/ 13 сентября 2009

См. Разницу между CURLOPT_CONNECTTIMEOUT и CURLOPT_TIMEOUT

0 голосов
/ 31 августа 2012

Я использую библиотеку Curl для загрузки файла с сервера Apache. Функция downloadFileWithCurlLibrary имеет два входа. FileUrl - это файл, загружаемый с сервера форм. Пример: www.abc.com/myfile.doc. locFile - это каталог и имя файла, который вы хотите сохранить. Пример: /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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...