curl连接超时不起作用

9
我正在使用 CURL 连接多个 XML 源并在页面加载时处理它们。不幸的是,偶尔会出现一个页面无响应,我的脚本也会停顿下来。以下是我正在使用的代码示例。虽然我将超时设置为 1,但似乎无效。今天我将超时设置为 0.0001 来进行测试,但仍然成功获取了 XML 源。你们有什么办法能够强制 CURL 在脚本耗时过长时超时呢?
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个回答

37

curl有两种不同的超时选项 -- 请参考curl_setopt手册页面

CURLOPT_CONNECTTIMEOUT
连接超时时间,以秒为单位。使用0表示无限等待。

和:

CURLOPT_TIMEOUT
cURL函数执行的最长时间,以秒为单位。

它们都有“毫秒”版本:CURLOPT_CONNECTTIMEOUT_MSCURLOPT_TIMEOUT_MS


在您的情况下,您可能还想配置第二个选项:似乎花费时间的不是连接,而是服务器端的Feed构建。


非常感谢,这对我非常有帮助。我正在尝试测试它是否有效,并通过如下代码将超时设置为1来实现此目的。我正在解析具有50-100个元素的XML,因此我想象需要的时间会超过一毫秒。我预计不会得到任何结果,但实际上一切都返回正常。curl_setopt($curl[$k], CURLOPT_TIMEOUT_MS, 1);我错过了什么吗?Pascal,非常感谢。 - Arnold
非常不错的 Pascal 示例。 - Ionut Flavius Pogacian

1

了解CURLOPT_CONNECTTIMEOUT和CURLOPT_TIMEOUT之间的区别


2
抱歉,但这个答案没有提供任何有用的信息。当然,这些是不同的选项,我们必须看到它们之间的区别 :) - DarkSide

0
我正在使用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;
}

如果你更详细地解释回调函数并且演示一下,你可能会得到更多的点赞。 - Tim Post
当超时发生时,此函数返回-1。 - omeraygor
1800秒 = 30分钟 - IanS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接