相关文章推荐
魁梧的羊肉串  ·  【Azure ...·  3 月前    · 
强悍的梨子  ·  python ...·  3 月前    · 
性感的鸵鸟  ·  curl命令 CURL命令 测试 ...·  3 月前    · 
失落的饼干  ·  2019/3/5#Unreal和Visual ...·  9 月前    · 
喝醉的铁板烧  ·  当使用C# ...·  1 年前    · 
小眼睛的葡萄  ·  DVWA_File Inclusion ...·  1 年前    · 
热心的大熊猫  ·  IBM Documentation·  1 年前    · 

http - 在PHP中设置Curl的超时

我正在通过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)。 有谁知道这是否是在卷曲中设置超时的正确方法?

Moki asked 2019-03-16T01:20:46Z

7个解决方案

289 votes

见文件:[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

msangel answered 2019-03-16T01:21:17Z

52 votes

嗯,它在我看来像CURLOPT_TIMEOUT定义了允许任何cURL函数执行的时间量。 我认为您实际上应该查看CURLOPT_CONNECTTIMEOUT,因为它告诉cURL等待连接完成的最长时间。

Chad Birch answered 2019-03-16T01:21:43Z

25 votes

您的代码将超时设置为1000秒。 对于毫秒,请使用CURLOPT_TIMEOUT_MS。

Matt Humphreys answered 2019-03-16T01:22:09Z

22 votes

这有一个怪癖可能与某些人有关......来自PHP文档的评论。

如果你希望cURL在不到一秒的时间内超时,你可以使用CURLOPT_TIMEOUT_MS,尽管在“类Unix系统”上有一个错误/“功能”导致libcurl立即超时如果值是&lt; 1000 ms,错误“cURL错误(28):达到超时”。 这种行为的解释是:

“如果libcurl构建为使用标准系统名称解析器,那么传输的那部分仍将使用全秒分辨率进行超时,允许的最小超时时间为1秒。”

这对PHP开发人员意味着“你不能在没有先测试它的情况下使用这个功能,因为你无法判断libcurl是否使用标准的系统名称解析器(但你可以非常肯定)”

问题是在(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]

Simon East answered 2019-03-16T01:23:19Z

8 votes

您无法从浏览器运行请求,它将超时等待运行CURL请求的服务器响应。 浏览器可能会在1-2分钟内超时,默认网络超时。

您需要从命令行/终端运行它。

Brent Baisley answered 2019-03-16T01:23:52Z

7 votes

您需要确保您和文件之间的超时。在这种情况下PHP和Curl。

要告知Curl在传输仍处于活动状态时永不超时,您需要将CURL_TIMEOUT设置为0,而不是1000。

curl_setopt($ch, CURLOPT_TIMEOUT, 0);

在PHP中,您必须再次删除时间限制或PHP自身(默认情况下30秒后)将沿着Curl的请求终止脚本。 仅这一点就可以解决您的问题。

此外,如果您需要数据完整性,可以使用CURL_TIMEOUT添加一层安全性:

# 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的顶部。

MarcoP answered 2019-03-16T01:25:03Z

3 votes

如果您使用PHP作为fastCGI应用程序,请确保检查fastCGI超时设置。请参阅:PHP curl put 500错误

wbinky answered 2019-03-16T01:25:31Z

最近在写一个应用程序, 需要与 HTTP 服务器进行数据交互, 于是乎自己写了一个类似wget的功能的客户端, 实现很简单, 但是功能不给力, 只可基本功能. 于是又在网上找了找, 发现使用lib curl 库很方便, 很强大, 比起wget之类的, 强大不是一点点.  下面是常用的GET/ POST / HTTP S/多线程 HTTP S的使用方法. 仅仅是一个实现函数.  背景:服务器上线了一个事件推送的功能。即主 服务器 系统产生的一些充值与下单的操作,会把这些动作消息推送给指定的活动服务器。我们采用的是 CURL 请求。但是,上线一段时间内发现消息吞吐很小,有时间还伴随请求 超时 。一、一个再正常不过的 PHP CURL 代码示例:$data = ['code' => 'buy', 'userid' => '123456', 'money' => ... 侃侃无极 curl 代码如下123456789101112131415161718192021222324/*** curl 操作*@paramunknown_type$pURL*@paramunknown_type$p Post Data*@returnunknown*/publicstaticfunctiongetURLCo... 原因:lib curl post 发送超过1024字节数据后,会多出一个步骤,即询问是否能发送超过1024数据的包。但 post man没有这个询问步骤。 如果想忽略此步骤,可以 例如目标网站Url:127.0.0.1:8080/check_your_status?user=Summer&passwd=12345678 通过Get方法请求: curl protocol://address:port/url?args curl http ://127.0.0.1:8080/check_your_status?user=Summer&passwd=12345678 通过 Post 方法. 【 HTTP 访问】一般我们访问 HTTP 方式很多,主要是: curl , socket, file_get_contents() 等方法。如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问 http 的时候也需要考虑 超时 的问题。[ CURL 访问 HTTP ] CURL 是我们常用的一种比较靠谱的访问 HTTP 协议接口的lib库,性能高,还有一些并发支持的功能等。 CURL : curl ... 本文档试图描述使用lib curl 编程时要考虑的一般原则和一些基本方法。该文本将主要关注C接口,也能够在其他类型的接口上得到应用,它们通常非常接近于C接口。 本文档将“用户(the user)”称为编写使用lib curl 的源代码的人。通常将“程序(the program)”是用户编写的使用lib curl 进行传输的收集源代码,该程序在lib curl 之外。 要获得有关此处所述的选项和功能的更多详细信息,请参阅其详细手册页。 构建C程序有许多不同的方法。 本章将.. 最近在学习lib curl ,并利用它提交 POST 请求,可是返回的响应总是无从验证该次 POST 请求是否成功提交了。 1. 先看下根据firebug提交的一次成功的请求,这里以login我喜欢上的xiami为例,嘻嘻~ 1.1 本次 POST 请求的 HTTP 交互 1.2 POST 1.3 经server端redirect的GET 2. OK,接下来看下使用lib... PHP 读取微信认证 超时 ,错误如下:[error] 1548#0: *137 FastCGI sent in stderr: " PHP message: PHP Fatal error: Uncaught exception 'WxPayException' with message ' curl 出错,错误码:28' in /home/cat/html/releases/20160825025148...