php curl要求情報と返信情報

2967 ワード

curlでウェブページの内容をキャプチャーする際、常にウェブページからの要求ヘッダ情報、要求に関する情報、特に要求過程にリダイレクトがある場合は、要求を元に戻してください.
以下は、要求にリダイレクトがある例です.最終的に実際に要求されたurlアドレスを取得するのが目的です.
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';

$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HEADER, 1);//  response    
curl_setopt($ch, CURLOPT_NOBODY, 1);//   response body  
//curl_setopt($ch, CURLOPT_MAXREDIRS, 1);//            
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//     response
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);//     response      Location ,      
$content=curl_exec($ch);
$rinfo=curl_getinfo($ch);

echo $content,"</br>";
echo "<hr>";
print_r($rinfo);
以下は出力の結果です.
HTTP/1.1
200 OKServer:nginxDate:Sat,22 Dec 2012 06:17:44 GMTContent-Type:appication/vnd.android.package-archiveConnection:close Last-Maodifed:Mon,03 Dec 2012 16:00 GMT Expires:Tue,03 Dec 2013
Aray([url]=>http://www.d.appchina.com/McDonald/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB 4 RaanvFL 6 t 6 Bj-vj 0 rIBs&p=apple.detail&m=redirect=>aplication/vd.android.package-archive[httpucode]=>200[headersize=>289[quefilt][redirectuucount]=>0[total time]=>0.7171621[namelookuupuutime]=>0.35256[connect time]=>0.0.0.529113[pretrasferutime]=>0.0.529191916[sizuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu9[uploadCantength]=>0[starttransferutime]=>0.71582[redirect time]=>0[certinfo]=>Aray() 
再帰要求を経て最終的に200のレスポンスを得ることができますが、この方法では最後の要求のurl、つまり最終的に実際に要請したurlを得るためには再帰的な分析が必要です.
以下は私が書いた最後の要求urlの再帰関数です.
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$realUrl=getRedirectLocation($url);

echo "</br>--->",$realUrl;

function getRedirectLocation($url){
	
	$realUrl=$url;
	echo $url,"</br>";
	$ch=curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//  curl       3 
	//curl_setopt($ch, CURLOPT_NOBODY, 1);//     ,    ,     302                url
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
	$content=curl_exec($ch);
	//echo $content;
	$rinfo=curl_getinfo($ch);
	$matches=array();
	if(preg_match('/Location:\s+?(.+?)\s+?/', $content,$matches)){
		//echo $matches[1],"</br>";
		unset($content);
		$realUrl=getRedirectLocation($matches[1]);
	}
	if(isset($content)){
		unset($content);
	}
	return $realUrl;
}