我正在通过php在eXist数据库上运行curl请求。数据集非常大,因此,数据库一直需要很长时间才能返回XML响应。为了解决这个问题,我们设置了一个curl请求,应该是一个长时间的超时。
$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'admin:');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);
但是,卷曲请求始终在请求完成之前结束(当通过浏览器请求时为<1000)。有谁知道这是否是在卷曲中设置超时的正确方法?
答案 0 :(得分:303)
请参阅文档:http://www.php.net/manual/en/function.curl-setopt.php
CURLOPT_CONNECTTIMEOUT
- 尝试连接时等待的秒数。使用0无限期等待
CURLOPT_TIMEOUT
- 允许cURL函数执行的最大秒数。
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds
也不要忘记放大php脚本自我执行时间:
set_time_limit(0);// to infinity for example
答案 1 :(得分:53)
嗯,在我看来,CURLOPT_TIMEOUT
定义了允许任何cURL函数执行的时间。我认为你实际上应该查看CURLOPT_CONNECTTIMEOUT
,因为它告诉cURL等待连接完成的最长时间。
答案 2 :(得分:26)
您的代码将超时设置为1000 秒。对于毫秒,请使用CURLOPT_TIMEOUT_MS
。
答案 3 :(得分:24)
这有一个怪癖可能与某些人有关......来自PHP文档评论。
如果你希望cURL在不到一秒的时间内超时,你可以使用
CURLOPT_TIMEOUT_MS
,虽然“类Unix系统”上有一个错误/“功能”导致libcurl立即超时如果值是&LT; 1000 ms,错误“cURL错误(28):达到超时”。这种行为的解释是:“如果libcurl构建为使用标准系统名称解析器,那么传输的那部分仍将使用全秒分辨率进行超时,允许的最小超时时间为1秒。”
这对PHP开发人员来说意味着“你不能先使用这个函数而不先测试它,因为你无法判断libcurl是否正在使用标准系统名称解析器(但你可以非常肯定)” / p>
问题是在(Li | U)nix上,当libcurl使用标准名称解析器时,会在名称解析期间引发SIGALRM,libcurl认为这是超时警报。
解决方案是使用CURLOPT_NOSIGNAL禁用信号。这是一个示例脚本,它请求自身导致10秒的延迟,以便您可以测试超时:
if (!isset($_GET['foo'])) {
// Client
$ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
$data = curl_exec($ch);
$curl_errno = curl_errno($ch);
$curl_error = curl_error($ch);
curl_close($ch);
if ($curl_errno > 0) {
echo "cURL Error ($curl_errno): $curl_error\n";
} else {
echo "Data received: $data\n";
}
} else {
// Server
sleep(10);
echo "Done.";
}
来自http://www.php.net/manual/en/function.curl-setopt.php#104597
答案 4 :(得分:8)
您无法从浏览器运行请求,它将超时等待运行CURL请求的服务器响应。浏览器可能会在1-2分钟内超时,默认网络超时。
您需要从命令行/终端运行它。
答案 5 :(得分:8)
您需要确保自己与文件之间的超时。 在这种情况下PHP和Curl。
要告知Curl在传输仍处于活动状态时永不超时,您需要将CURLOPT_TIMEOUT
设置为0
,而不是1000
。
curl_setopt($ch, CURLOPT_TIMEOUT, 0);
在PHP中,您必须再次删除时间限制或PHP自身(默认情况下为30秒后)将沿着Curl的请求终止脚本。 仅此一项就可以解决您的问题
此外,如果您需要数据完整性,可以使用ignore_user_abort
:
# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);
# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);
客户端断开连接将中断脚本的执行并可能损坏数据,
例如。非过渡数据库查询,构建配置文件,ecc。,在你的情况下,它会下载一个部分文件......你可能或不关心这个。
回答这个老问题,因为此帖子位于引擎搜索CURL_TIMEOUT
的顶部。
答案 6 :(得分:3)
如果您使用PHP作为fastCGI应用程序,请确保检查fastCGI超时设置。 请参阅:PHP curl put 500 error