2010-07-13 11 views
7

मैं एक यूआरएल को कर्ल करने और प्रत्येक व्यक्तिगत यूआरएल के माध्यम से ट्रैक रखने के लिए देख रहा हूं। किसी कारण से मैं रिकर्सिव कर्ल कॉल किए बिना इसे पूरा करने में असमर्थ हूं जो आदर्श नहीं है। शायद मुझे कुछ आसान विकल्प याद आ रहा है। विचार?PHP: curl और सभी पुनर्निर्देशनों का ट्रैक रखें

$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>"; 
} 

और मैं इस

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 
) 

उत्तर

9

ऐसी ही प्रतिक्रिया आप

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

इसका मतलब है कि cURL रीडायरेक्ट का पालन करें और कोई स्थान हेडर के साथ आप केवल अंतिम पृष्ठ वापस आ जाएगी है मिलता है।

मैन्युअल स्थान का पालन करें:

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

क्या होगा? – ChristoKiwi

2

मैं एक सिफारिश कर सकता है ...

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

परिवर्तन /(Location:|URI:)(.*?)\n करने के लिए regex/मैं तो यह असंवेदनशील मामला है। मैंने देखा कि कुछ साइट्स/स्थान हैं जो स्थान का उपयोग कर रहे हैं: जहां एल कम मामला है।

बस उन लोगों की मदद करने के लिए एक विचार जो सोचते थे कि कभी-कभी यह क्यों काम नहीं कर रहा है ... उसमें देखो।

2

libcurl के साथ, आप CURLINFO_REDIRECT_URL getinfo चर का उपयोग यूआरएल यह अगर यह सक्षम किया गया था पुनः निर्देशित होता है पता लगाने के लिए कर सकते हैं। यह कार्यक्रमों को आसानी से रीडायरेक्ट को पार करने की अनुमति देता है।

यह दृष्टिकोण Location: शीर्षकों के पार्सिंग की तुलना में बहुत बेहतर और आसान है, अन्य लोगों ने यहां सुझाव दिया है, तब आपके कोड को सापेक्ष पथ आदि का पुनर्निर्माण करना होगा। CURLINFO_REDIRECT_URL आपके लिए स्वचालित रूप से ठीक करता है।

PHP/कर्ल पीएचपी 5.3.7 में support for this feature जोड़ा बंधन:

$url = curl_getinfo($ch, CURLINFO_REDIRECT_URL) 

प्रतिबद्ध है कि तय यह: `एक उदाहरण के रूप में $ redirectcallback` http://lxr.php.net/history/PHP-MASTER/ext/curl/interface.c#599d9134 (अप्रैल, 2011)

+0

अरे, लिंक अब और काम नहीं करता है। क्या इसे कार्यान्वित किया गया है, और यदि हां, तो क्या आप जानते हैं कि PHP से इसका उपयोग कैसे करें? –

+1

मैं इस अंतर्दृष्टि के लिए आभारी हूं, मुझे इसे स्टेटस कोड पर मैन्युअल रूप से लूप करने और रीडायरेक्ट यूआरएल खोजने से कहीं ज्यादा पसंद है। –

+0

पवित्र बकवास मैंने अभी महसूस किया कि आप कौन हैं। –