Php cURL使页面永远加载,然后网关超时

Php cURL使页面永远加载,然后网关超时,php,curl,http-status-code-504,Php,Curl,Http Status Code 504,我使用的是第三方API,当您出错时,它会返回400 HTTP状态。 当使用POSTMAN时,400HTTP错误页面如预期的那样显示,但是当使用PHP的cURL时,页面只加载大约一分钟,然后它给我一个“504-网关超时”,我需要关闭浏览器才能再次访问该页面。 当cURL请求有效(API返回200ok)时,它正常工作 我的问题是,为什么cURL给出的是504而不是400? 为什么会忽略CURLOPT_CONNECTTIMEOUT和CURLOPT_TIMEOUT 下面是我的cURL代码($token、

我使用的是第三方API,当您出错时,它会返回400 HTTP状态。 当使用POSTMAN时,400HTTP错误页面如预期的那样显示,但是当使用PHP的cURL时,页面只加载大约一分钟,然后它给我一个“504-网关超时”,我需要关闭浏览器才能再次访问该页面。 当cURL请求有效(API返回200ok)时,它正常工作

我的问题是,为什么cURL给出的是504而不是400? 为什么会忽略CURLOPT_CONNECTTIMEOUT和CURLOPT_TIMEOUT

下面是我的cURL代码($token、$payload和$config变量都已声明且有效):


API可能在两者之间发送
HTTP302
,如果是这样,您需要两个请求,或者
告诉cURL使用
cURL\u setopt($ch,CURLOPT\u FOLLOWLOCATION,true)跟随重定向

HTTP504
表示客户端没有及时响应上一个HTTP头
HTTP504可能还有其他原因,但这是最常见的原因之一。邮递员不足以正确地测试这一点(我根本不使用它);最好使用web浏览器,点击
F12
并勾选“保留日志”复选框。。。然后您可以清楚地看到哪些HTTP头被连续发送


调试这一点也很有用:
curl\u setopt($ch,CURLOPT\u HEADER,true)

API可能在两者之间发送
HTTP302
,如果是这样,您需要两个请求,或者
告诉cURL使用
cURL\u setopt($ch,CURLOPT\u FOLLOWLOCATION,true)跟随重定向

HTTP504
表示客户端没有及时响应上一个HTTP头
HTTP504可能还有其他原因,但这是最常见的原因之一。邮递员不足以正确地测试这一点(我根本不使用它);最好使用web浏览器,点击
F12
并勾选“保留日志”复选框。。。然后您可以清楚地看到哪些HTTP头被连续发送


调试这一点也很有用:
curl\u setopt($ch,CURLOPT\u HEADER,true)

504网关超时由请求中未包含此API的后端服务器执行,这与408请求超时不同。我猜标题可能是错误的,请检查用户代理、令牌或Postman拥有的其他配置,而curl没有配置。504网关超时由该API的后端服务器执行,不在请求中,这与408请求超时不同。我猜标题可能是错误的,检查用户代理、令牌或Postman拥有的其他配置,而curl没有配置。即使设置FOLLOWLOCATION,我也会得到相同的结果:几乎无限加载,然后在浏览器中出现504错误。而CURLOPT_头只会使cURL失败btw@Thiago此选项应列出发送和接收的所有标题。确保你使用一个健全的环境。。。“只是让它失败”根本不是一个错误描述,因为它几乎没有理由失败。如果您只需要一个简单的HTML表单并发布它,那么它应该可以在web浏览器中进行测试。改进cURL错误处理也可能有意义,因为您没有遵循那里的默认过程<代码>变量转储($e)
是无用的。。。。使用
curl\u error($ch)
,以避免忽略最终的错误。另请参阅…有效负载可能是错误的。对不起,我对此一无所知,只能参考:。。。GET
/items
只会给我
未找到的资源(可能是因为它需要一篇文章)。通常,cURL只是模拟一个web浏览器,这就是为什么人们可以使用web浏览器来确定要模拟什么;“just make if fail”发生在我添加CURLOPT_头时,它给了我永远相同的加载,然后504,即使有效负载是正确的(我的意思是:没有CURLOPT_头也可以工作)。API的文档是葡萄牙语的,所以您不理解它是正常的。我需要捕捉那些API错误,因为客户端有时可能会犯错误,给他们一个“504-网关超时”页面根本不好。你能访问任何使用GET的路由吗?例如,列出那些项目?不需要抛出
异常
,但如果有错误,可以从cURL句柄获取。我的代码通常看起来没什么不同(除了错误处理),但我通常只调用
curl\u init()
,然后设置URL和选项。启用选项
CURLOPT_HEADER
后,您应该会得到类似以下内容的输出:……这对于调试非常重要。即使设置FOLLOWLOCATION,我也会得到相同的结果:几乎无限加载,然后在浏览器中出现504错误。而CURLOPT_头只会使cURL失败btw@Thiago此选项应列出发送和接收的所有标题。确保你使用一个健全的环境。。。“只是让它失败”根本不是一个错误描述,因为它几乎没有理由失败。如果您只需要一个简单的HTML表单并发布它,那么它应该可以在web浏览器中进行测试。改进cURL错误处理也可能有意义,因为您没有遵循那里的默认过程<代码>变量转储($e)
是无用的。。。。使用
curl\u error($ch)
,以避免忽略最终的错误。另请参阅…有效负载可能是错误的。对不起,我对此一无所知,只能参考:。。。GET
/items
只会给我
未找到的资源(可能是因为它需要一篇文章)。通常,cURL只是模拟一个web浏览器,这就是为什么人们可以使用web浏览器来确定要模拟什么;当我添加CURLOPT_头时,会出现“just make if fail”,它将永远为我提供与504相同的加载,即使paylo
$ch = curl_init("https://api.mercadolibre.com/items?access_token=$token");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "User-Agent: Alcavie/" . $config['version'],
    "Accept: application/json",
    "Content-Type: application/json",
    //"Accept-Encoding: gzip, deflate, br",
    //"Connection: keep-alive"
));

$error = false;
try{
    $result = curl_exec($ch);
    $resultJson = json_decode($result);
}catch(\Exception $e){
    var_dump($e);
    $error = true;
    exit;
}
curl_close($ch);