2009-09-13 49 views
7

Tôi đang sử dụng CURL để kết nối với nhiều nguồn cấp dữ liệu xml và xử lý chúng khi tải trang. Thật không may, mỗi một lần trong một thời gian một trang sẽ không được đáp ứng và kịch bản của tôi sẽ gian hàng là tốt. Đây là một ví dụ về mã mà tôi đang làm việc. Tôi đặt thời gian chờ thành 1 nhưng điều đó dường như không hoạt động. Sau đó tôi đặt thời gian chờ là 0,0001 chỉ để kiểm tra mọi thứ ngày hôm nay và nó vẫn kéo vào nguồn cấp dữ liệu xml. Các bạn có ý tưởng nào về cách buộc curl hết thời gian chờ khi một tập lệnh đang diễn ra mãi mãi không.thời gian chờ kết nối curl không hoạt động

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

Trả lời

0

Xem sự khác biệt giữa CURLOPT_CONNECTTIMEOUT và CURLOPT_TIMEOUT

+1

Xin lỗi, nhưng câu trả lời này không cung cấp bất kỳ thông tin hữu ích nào. Tất nhiên đây là những lựa chọn khác nhau và tất nhiên chúng ta phải thấy sự khác biệt :) – DarkSide

37

Có hai timeouts khác nhau với curl - xem curl_setopt manual's page:

CURLOPT_CONNECTTIMEOUT
Số giây để chờ đợi trong khi cố gắng kết nối . Sử dụng 0 để chờ vô thời hạn.

Và:

CURLOPT_TIMEOUT
Số lượng tối đa giây để cho phép chức năng cURL để thực thi.

Cả hai đều có phiên bản "mili giây": CURLOPT_CONNECTTIMEOUT_MSCURLOPT_TIMEOUT_MS tương ứng.


Trong trường hợp của bạn, bạn cũng có thể muốn định cấu hình lần thứ hai: những gì dường như mất thời gian không phải là kết nối, nhưng việc xây dựng nguồn cấp dữ liệu ở phía máy chủ.

+0

Cảm ơn rất nhiều điều này cực kỳ hữu ích. Tôi đang cố gắng để kiểm tra xem nó hoạt động và để làm điều này tôi đặt thời gian chờ để 1 như trong mã dưới đây. Tôi đang phân tích cú pháp xml với 50-100 yếu tố vì vậy tôi sẽ tưởng tượng nó sẽ mất hơn một phần nghìn giây. Tôi hy vọng sẽ không có kết quả nhưng thay vào đó mọi thứ trở lại như bình thường. \t curl_setopt ($ curl [$ k], CURLOPT_TIMEOUT_MS, 1); Tôi có thiếu gì đó không? Cảm ơn rất nhiều Pascal Russ –

+0

ví dụ thực sự tốt đẹp có Pascal –

0

tôi đang sử dụng thư viện Curl để tải xuống tệp từ Máy chủ Apache. downloadFileWithCurlLibrary fonction có hai yếu tố đầu vào. FileUrl là tệp sẽ tải xuống máy chủ biểu mẫu. Ví dụ: www.abc.com/myfile.doc. locFile là tên thư mục và tên tệp bạn muốn lưu. Ví dụ: /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

Bạn có thể sẽ nhận được phiếu nếu bạn giải thích điều này nhiều hơn và thực sự đã trình diễn các chức năng gọi lại. –

+0

Khi hết thời gian chờ. Hàm này trả về -1. – omeraygor

Các vấn đề liên quan