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

cURL makes page load forever, then gateway timed out

我正在与第三方合作 API,当您出错时它 returns 400 HTTP STATUS。 当使用 POSTMAN 时,400 HTTP 错误页面按预期显示,但是当使用 PHP 的 cURL 时,页面只加载了大约一分钟,然后它给了我一个“504 - 网关超时”,我需要关闭浏览器以便能够再次访问该页面。 当 cURL 请求有效时(API returns 200 OK)它正常工作。

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

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

$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);

API 可能会在两者之间发送 HTTP302,如果是这样,您要么需要两个请求,要么
告诉 cURL 使用 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);[ 跟随重定向=20=]HTTP504表示客户端没有及时响应之前的HTTPheader;
可能还有其他原因造成HTTP504,但是是最常见的一种。邮递员不足以正确测试它(我根本不使用它);最好使用 web-browser,点击 F12 并勾选“保留日志”复选框...然后您可以清楚地看到连续发送了哪些 HTTP header。

对调试也很有用的是:curl_setopt($ch, CURLOPT_HEADER, true);