如何处理CURL中的服务器连接重置问题

3
我正在向一个需要令牌身份验证的远程服务器(Vebra Api)发起curl请求。据我所知,该服务器每小时只允许一个令牌请求。我试图确定我的当前令牌是否有效。
我的方法是发出请求并检查状态是否为200或401。如果我有一个有效的令牌,我可以使用curl_getinfo($ch)成功检查curl信息以获取正确的状态码。然而,如果我的令牌无效,则脚本会在我无法处理错误或处理任何其他代码之前终止 - Firefox报告The connection was reset
这是我的代码问题还是服务器问题?可能有一种方法可以告诉curl函数在这种情况下调用某个函数吗?
代码如下:
// an invalid token
$token = '1sdfsdfds1RQUlJTTU1GRVdVT0tYUkJsdfsdfsdfdsfsdSEg=';

//Initiate a new curl session
$ch = curl_init($url);

//Don't require header this time as curl_getinfo will tell us if we get HTTP 200 or 401
curl_setopt($ch, CURLOPT_HEADER, 0); 

//Provide Token in header
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Basic '. $token ) ); 

// Tell curl to return a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//Execute the curl session
$curlResp = curl_exec($ch);

// -----------------------------------------------------------------------------
// with invalid token script ends here with no chance for me to handle the error
// such as below
// -----------------------------------------------------------------------------

if ($curlResp === FALSE) {
    die('yarrrghhh! :(');
    //throw new Exception(); 
}

//Store the curl session info/returned headers into the $info array
$info = curl_getinfo($ch);

//Check if we have been authorised or not
if($info['http_code'] == '401') {

    echo 'Token Failed';

    var_dump($info);
    var_dump($curlResp);

} 
elseif ($info['http_code'] == '200') {

    echo 'Token Worked';

    var_dump($info);
    var_dump($curlResp);

}

//Close the curl session
curl_close($ch);

1
我建议尝试使用cURL参数来看看如何使其工作。我会尝试使用CURLOPT_HEADER, 1CURLOPT_NOBODY, 1。此外,当出现此问题时,您是否在错误日志中有任何记录? - Ranty
很好的建议,不幸的是在CURLOPT_HEADER、1和CURLOPT_NOBODY、1方面仍然没有运气,并且日志中也没有任何信息。你会认为无论服务器响应如何,都应该有一些机制来处理它。 - Gga
1
CURLOPT_HTTPAUTH, CURLAUTH_ANYCURLOPT_HTTPAUTH, CURLAUTH_BASIC 怎么样?你正在使用认证,但没有告诉 cURL。 - Ranty
仍然不幸地被重置 - Gga
有其他日志记录可能无法记录在正常的错误/访问日志中的事情。我在我的服务器上找到了这个日志:/var/log/httpd/error_log,不确定我们是否运行相同的软件。看看里面是否有什么东西。另外一边注意 - 尝试在其他浏览器中运行脚本。 - Ranty
1个回答

0

我认为$curlResp只是一个字符串

尝试使用

if ($curlResp == FALSE) {
die('yarrrghhh! :(');
//throw new Exception(); 
}

我已经测试了这段代码,并通过php-cli和var_dump对其进行了测试,结果返回一个字符串.. 这很奇怪,因为php文档说的是不同的事情。

$curlResp是一个字符串,但如果你阅读代码,它永远不会到达那个点。 - Gga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接