Php 旋涡连接超时不工作
我使用CURL连接到多个xml提要,并在页面加载时处理它们。不幸的是,每隔一段时间,一个页面就会失去响应,我的脚本也会暂停。下面是我正在使用的代码示例。我将超时设置为1,但这似乎不起作用。然后,我将超时设置为0.0001,只是为了测试今天的情况,它仍然拉入xml提要。你们有没有什么想法,当一个脚本需要花费很长时间时,如何强制curl超时Php 旋涡连接超时不工作,php,curl,timeout,Php,Curl,Timeout,我使用CURL连接到多个xml提要,并在页面加载时处理它们。不幸的是,每隔一段时间,一个页面就会失去响应,我的脚本也会暂停。下面是我正在使用的代码示例。我将超时设置为1,但这似乎不起作用。然后,我将超时设置为0.0001,只是为了测试今天的情况,它仍然拉入xml提要。你们有没有什么想法,当一个脚本需要花费很长时间时,如何强制curl超时 foreach($urls as $k => $v) { $curl[$k] = curl_init(); curl_setopt($c
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);
查看CURLOPT_CONNECTTIMEOUT和CURLOPT_TIMEOUT之间的区别使用curl时有两种不同的超时--请参阅:
CURLOPT\u CONNECTTIMEOUT
号码 尝试执行时等待的秒数 连接使用0无限期等待 以及:
CURLOPT\u超时
最大值 允许cURL函数运行的秒数 执行 它们都有一个“毫秒”版本:
CURLOPT\u CONNECTTIMEOUT\u MS
和CURLOPT\u TIMEOUT\u MS
在您的情况下,您可能还需要配置第二个:似乎需要时间的不是连接,而是服务器端提要的构造。我正在使用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;
}
#包括
#包括
#包括
#包括
#包括
int downloadFileWithCurlLibrary(char*FileUrl,char*locFile)
{
char-dlFile[1024];
卷曲*卷曲柄;
文件*页面文件;
memset(dlFile,0x0,sizeof(dlFile));
/*创建URL*/
sprintf(dlFile,“%s”,FileUrl);
curl\u global\u init(curl\u global\u ALL);
/*初始化curl会话*/
curl_handle=curl_easy_init();
/*在此设置超时3分钟=3*60秒*/
curl_easy_setopt(curl_句柄,CURLOPT_超时,1800);
/*设置URL以到达此处*/
if(curl\u easy\u setopt(curl\u句柄、CURLOPT\u URL、dlFile)!=CURLE\u确定)
返回-1;
/*测试时打开完整协议/调试输出*/
//if(curl\u easy\u setopt(curl\u handle,CURLOPT\u VERBOSE,1L)!=CURLE\u OK)
//返回-1;
/*禁用进度计,设置为0L以启用和禁用调试输出*/
如果(卷曲轻松设置(卷曲手柄,卷曲前进,1L)!=卷曲正常)
返回-1;
/*将所有数据发送到此函数*/
if(curl\u easy\u setopt(curl\u句柄、CURLOPT\u WRITEFUNCTION、write\u数据)!=CURLE\u OK)
返回-1;
/*打开文件*/
pagefile=fopen(locFile,“wb”);
如果(页面文件)
{
/*将页面正文写入此文件句柄。CURLOPT_文件也称为
CURLOPT_WRITEDATA*/
if(curl\u easy\u setopt(curl\u句柄、CURLOPT\u文件、页面文件)!=CURLE\u确定)
返回-1;
/*明白了*/
如果(卷曲轻松执行(卷曲手柄)!=0)
返回-1;
/*关闭头文件*/
fclose(页面文件);
}
其他的
{
返回-1;
}
/*清理卷曲的东西*/
卷曲易于清理(卷曲手柄);
返回0;
}
非常感谢,这非常有帮助。我试图测试它是否有效,为此,我将超时设置为1,如下面的代码所示。我正在解析包含50-100个元素的XML,所以我可以想象这将需要超过一毫秒的时间。我本以为不会有结果,但结果一切正常。curl_setopt($curl[$k],CURLOPT_TIMEOUT_MS,1);我错过什么了吗?非常感谢Pascal Russreally提供了一个很好的例子,如果您详细解释了这一点,并实际演示了回调函数,PascalYou可能会收到最多的选票。这个函数返回-1.1800s=30分钟,但这个答案没有给出任何有用的信息。当然,这些是不同的选择,当然我们必须看到不同:)