2010-07-13 25 views
7

Bir URL'ye cURL bakıyorum ve geçtiği her bir URL'yi takip ediyorum. Bazı nedenlerden dolayı ideal olmayan tekrarlı CURL çağrıları yapmadan bunu başaramıyorum. Belki de bazı kolay seçenek eksik. Düşünceler?PHP: cURL ve tüm yönlendirmeleri takip et

$url = "some url with redirects"; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, false); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0"); 

$html = curl_exec($ch); 
$info = array(); 
if(!curl_errno($ch)) 
{ 
     $info = curl_getinfo($ch); 
     echo "<pre>"; 
     print_r($info); 
     echo "</pre>"; 
} 

ve ben bu

Array 
(
    [url] => THE LAST URL THAT WAS HIT 
    [content_type] => text/html; charset=utf-8 
    [http_code] => 200 
    [header_size] => 1942 
    [request_size] => 1047 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 2 <---- I WANT THESE 
    [total_time] => 0.799589 
    [namelookup_time] => 0.000741 
    [connect_time] => 0.104206 
    [pretransfer_time] => 0.104306 
    [size_upload] => 0 
    [size_download] => 49460 
    [speed_download] => 61856 
    [speed_upload] => 0 
    [download_content_length] => 49460 
    [upload_content_length] => 0 
    [starttransfer_time] => 0.280781 
    [redirect_time] => 0.400723 
) 

cevap

9

gibi bir yanıt Bu cURL yönlendirmeleri takip edip Konum başlığı ile size sadece son sayfasını dönecektir anlamına gelir

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

var olsun.

elle konumunu izleyin:

function getWebPage($url, $redirectcallback = null){ 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_NOBODY, false); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0"); 

    $html = curl_exec($ch); 
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    if ($http_code == 301 || $http_code == 302) { 
     list($httpheader) = explode("\r\n\r\n", $html, 2); 
     $matches = array(); 
     preg_match('/(Location:|URI:)(.*?)\n/', $httpheader, $matches); 
     $nurl = trim(array_pop($matches)); 
     $url_parsed = parse_url($nurl); 
     if (isset($url_parsed)) { 
      if($redirectcallback){ // callback 
       $redirectcallback($nurl, $url); 
      } 
      $html = getWebPage($nurl, $redirectcallback); 
     } 
    } 
    return $html; 
} 

function trackAllLocations($newUrl, $currentUrl){ 
    echo $currentUrl.' ---> '.$newUrl."\r\n"; 
} 

getWebPage('some url with redirects', 'trackAllLocations'); 
+0

ne olurdu '$ redirectcallback':

$url = curl_getinfo($ch, CURLINFO_REDIRECT_URL) 

o sabit bu taahhüt? – ChristoKiwi

2

Bir öneride olsun ...

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

değişikliği /(Location:|URI:)(.*?)\n için regex/i olsun bu durumda duyarsız. Konumunu kullanan bazı siteler/yerler var: L'nin küçük harf olduğu yerler.

Bazen neden çalışmadığını merak edenlere yardım etmek için bir düşünün.

2

Libcurl ile getinfo değişkenini kullanarak URL'yi adresinden etkinleştirilmişse yeniden yönlendirebilirsiniz. Bu, programların yönlendirmelerin kendiliğinden kolayca geçmesine izin verir.

Bu yaklaşım, diğerlerinin önerdiği Location: başlıklarının ayrıştırılmasından çok daha iyi ve daha kolaydır, çünkü kodunuz göreceli yolları vb. Yeniden oluşturmalıdır. CURLINFO_REDIRECT_URL otomatik olarak sizin için bunu düzeltmektedir.

PHP/CURL PHP 5.3.7 yılında support for this feature eklendi bağlanma: örnek olarak http://lxr.php.net/history/PHP-MASTER/ext/curl/interface.c#599d9134 (Nisan, 2011)

+0

Hey, bağlantı artık çalışmıyor. Bu uygulandı mı ve eğer öyleyse, bunu PHP'den nasıl kullanacağınızı biliyor musunuz? –

+1

Bu içgörü için minnettarım, durum kodlarını manuel olarak değiştirmek ve yönlendirme URL'si bulmaktan çok daha fazlasını seviyorum. –

+0

Kutsal şeyler Kim olduğunuzu anladım. –