php curl多初始化HTTP 401未经授权
我使用了一个curl single init来发出一个httpget,所有这些都工作得很好。 现在我尝试使用multi-init(因为我需要获取多个URL),在对get的响应上得到了一条401消息,上面写着“此请求需要HTTP身份验证”。 在两种情况下使用相同的卷曲选项。 这是多初始化的代码,下面是单初始化函数php curl多初始化HTTP 401未经授权,php,authentication,curl,Php,Authentication,Curl,我使用了一个curl single init来发出一个httpget,所有这些都工作得很好。 现在我尝试使用multi-init(因为我需要获取多个URL),在对get的响应上得到了一条401消息,上面写着“此请求需要HTTP身份验证”。 在两种情况下使用相同的卷曲选项。 这是多初始化的代码,下面是单初始化函数 protected function _multiQueryRunkeeper($uri, $subscribersInfo,$acceptHeader) { $c
protected function _multiQueryRunkeeper($uri, $subscribersInfo,$acceptHeader) {
$curlOptions = array(
CURLOPT_URL => 'https://api.runkeeper.com' . $uri,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 8,
CURLOPT_HTTPAUTH => CURLAUTH_ANY,
CURLOPT_HTTPGET => true
);
$curl_array = array();
$mh = curl_multi_init();
foreach ($subscribersInfo as $i => $subscriber) {
$curl_array[$i] = curl_init();
curl_setopt_array($curl_array[$i],$curlOptions);
curl_setopt($curl_array[$i], CURLOPT_HEADER,
array('Authorization: Bearer '.$subscriber['token'],
'Accept: application/vnd.com.runkeeper.' . $acceptHeader));
curl_multi_add_handle($mh,$curl_array[$i]);
}
$running = NULL;
do {
usleep(10000);
curl_multi_exec($mh,$running);
} while($running > 0);
$subscribersWorkoutFeed = array();
foreach($subscribersInfo as $i => $subscriber)
{
$subscribersWorkoutFeed[$i] = curl_multi_getcontent($curl_array[$i]);
curl_multi_remove_handle($mh, $curl_array[$i]);
}
curl_multi_close($mh);
return $subscribersWorkoutFeed;
}
protected function _singleQueryRunkeeper($uri, $subscriberToken,$acceptHeader) {
try{
// get fitness user's fitness activities from Runkeeper
$this->_curl = isset($this->_curl)? $this->_curl : curl_init();
$curlOptions = array(
CURLOPT_URL => 'https://api.runkeeper.com' . $uri,
CURLOPT_HTTPHEADER => array('Authorization: Bearer '.$subscriberToken,
'Accept: application/vnd.com.runkeeper.' . $acceptHeader),
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 8,
CURLOPT_HTTPGET => true
);
curl_setopt_array($this->_curl,$curlOptions);
$response = curl_exec($this->_curl);
if($response == false) {
if (Zend_Registry::isRegistered('logger')) {
$logger = Zend_Registry::get('logger');
$logger->log('Curl error on _singleQueryRunkeeper: '
. curl_error($this->_curl), Zend_Log::INFO);
}
return null;
}
$data = Zend_Json::decode($response);
return($data);
} catch(Exception $e){
if (Zend_Registry::isRegistered('logger')) {
$logger = Zend_Registry::get('logger');
$logger->log('exception occured on getUsersLatestWorkoutsFromRK. Curl error'
. curl_error($this->_curl), Zend_Log::INFO);
}
}
}
提供有效的单curl请求代码。在我看来,“相同的选择”并不完全相同。另外,作为响应状态,您需要使用
HTTP身份验证
-CURLOPT\u HTTPAUTH
/CURLOPT\u USERPWD
。你有没有试过使用它,或者你只是“没有它也能用,为什么要试试?”?谢谢。我已经添加了单卷曲请求代码。我还尝试添加了CURLOPT_HTTPAUTH,但得到了相同的结果。至于CURLOPT_USERPWD,它是一个auoth协议,不需要用户和pwd。那么,试试CURLOPT_FRESH_CONNECT,TRUE
。除此之外,请尝试检查您的$subscribersInfo
有效性。例如,通过\u singleQueryRunkeeper
对多个请求执行循环-您将看到它是否有效。另外,您确定singe query runner不会通过$this->\u curl=isset($this->\u curl)获得带有附加选项的curl吗$this->_curl:curl_init()代码>?作为旁注,您需要curl\u close($curl\u数组[$i])
aftercurl\u multi\u remove\u句柄($mh,$curl\u数组[$i])代码>我相信我找到了问题所在。curl似乎不喜欢调用curl_setopt_数组,而且在调用curl_setopt之后。当我只使用curl_setopt_数组并删除curl_setopt时,一切正常。谢谢兰蒂的帮助。