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);
我正在与第三方合作 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);