2008年11月10日

php curl BUG修正函數

the problem: curl_setopt($ch,FOLLOW_LOCATION,1);

the error: trouble with open_basedir and safe_mode

the solution: a function already developed by someone

the solution n 2: the same function, modifed, works great for me..



function curl_redir_exec($ch,$debug="")

{


static $curl_loops = 0;


static $curl_max_loops = 20;


if ($curl_loops++ >= $curl_max_loops)


{


$curl_loops = 0;


return FALSE;


}


curl_setopt($ch, CURLOPT_HEADER, true);


curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);


$data = curl_exec($ch);


$debbbb = $data;


list($header, $data) = explode( "\n\n", $data, 2);


$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);


if ($http_code == 301 || $http_code == 302) {


$matches = array();


preg_match('/Location:(.*?)\n/', $header, $matches);


$url = @parse_url(trim(array_pop($matches)));


//print_r($url);


if (!$url)


{


//couldn't process the url to redirect to


$curl_loops = 0;


return $data;


}


$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));


/* if (!$url['scheme'])


$url['scheme'] = $last_url['scheme'];


if (!$url['host'])


$url['host'] = $last_url['host'];


if (!$url['path'])


$url['path'] = $last_url['path'];*/


$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');


curl_setopt($ch, CURLOPT_URL, $new_url);


// debug('Redirecting to', $new_url);


return curl_redir_exec($ch);


} else {


$curl_loops=0;


return $debbbb;


}

}