2011-09-27 19 views
6

जानकारी के लिए सर्वर पर एक रीडायरेक्ट है और एक बार प्रतिक्रिया सर्वर से आती है, तो मैं 4XX से शुरू होने वाला कोई कोड होने पर अपवाद फेंकने के लिए HTTP कोड देखना चाहता हूं। इसके लिए मुझे यह जानने की ज़रूरत है कि मैं हेडर से केवल HTTP कोड कैसे प्राप्त कर सकता हूं? यहां तक ​​कि यहां सर्वर के लिए पुनर्निर्देशन शामिल है इसलिए मुझे डर है कि कर्ल मेरे लिए उपयोगी नहीं होगा।रीडायरेक्ट के बाद HTTP प्रतिक्रिया कोड

अब तक मैंने this solution को आजमाया है लेकिन यह बहुत धीमा है और मेरे मामले में स्क्रिप्ट का समय बनाता है। मैं स्क्रिप्ट टाइम आउट अवधि को बढ़ाना नहीं चाहता हूं और केवल HTTP कोड प्राप्त करने के लिए प्रतीक्षा कर रहा हूं।

किसी भी सुझाव के लिए अग्रिम धन्यवाद।

+2

curl रीडायरेक्ट का पालन ठीक कर सकते हैं। आप इसे अपनी धारणाओं से डरने के बजाय दस्तावेज़ में पढ़ सकते हैं: http://php.net/manual/en/function.curl-setopt.php, 'CURLOPT_FOLLOWLOCATION' – Piskvor

+0

के लिए देखें I CURLOPT_FOLLOWLOCATION विकल्प के साथ कर्ल करने का प्रयास किया। बात यह है कि यह मेरे स्थानीय सर्वर पर एक पृष्ठ लाया गया है और जब मैं सर्वर से प्राप्त पृष्ठ पर उपयोगकर्ता नाम/पासवर्ड दर्ज करता हूं, तो सर्वर पुनर्निर्देशन में भ्रमित हो जाता है। इसे कैसे हल करें? –

उत्तर

6

कुछ की तरह:

$ch = curl_init(); 
    $httpcode = curl_getinfo ($ch, CURLINFO_HTTP_CODE); 

आप HttpEngine कक्षा प्रयास करना चाहिए। उम्मीद है कि यह मदद करता है।

-

संपादित

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, $your_agent_variable); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_REFERER, $your_referer); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
$output = curl_exec($ch); 
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 

if ($httpcode ...) 
+0

क्षमा करें मुझे HttpEngine क्लास के बारे में पता नहीं है। क्या आप मुझे उस पर कुछ जानकारी दे सकते हैं? –

+0

कोई समस्या नहीं है। खैर, मुझे याद नहीं है कि मुझे यह कक्षा कहां मिली ... इसलिए मैंने इसे यहां अपलोड किया: http://pastebin.ca/2083612 मुझे बताएं कि आपको किसी मदद की ज़रूरत है! –

+0

मैंने कक्षा फ़ाइल में देखा लेकिन यह सुनिश्चित नहीं है कि यह यहां कैसे मदद करेगा। यह कर्ल का उपयोग करता है और जब मैं CURLOPT_FOLLOWLOCATION को रीडायरेक्ट के लिए सत्य बनाता हूं तो कर्ल का उपयोग करता हूं, GET विधि पूरे पृष्ठ को ला रही है। –

0

समाधान आप पाया अच्छा लगता है। यदि सर्वर आपको समय में http शीर्षलेख भेजने में सक्षम नहीं है तो आपकी समस्या यह है कि अन्य सर्वर टूटा हुआ है या बहुत भारी लोड के तहत है।

8

get_headers साथ आपका विधि और पहली प्रतिक्रिया लाइन रीडायरेक्ट की स्थिति कोड अधिक महत्वपूर्ण बात यह वापस आ जाएगी (यदि हो तो) और का अनुरोध, यह एक GET अनुरोध जो पूरी फ़ाइल स्थानांतरित करेंगे करेंगे।

आपको केवल एक हेड अनुरोध की आवश्यकता है और फिर हेडर को पार्स करने के लिए और अंतिम स्थिति कोड लौटाएं। के बाद एक कोड उदाहरण है कि यह करता है, यह get_headers के बजाय $http_response_header उपयोग कर रहा है, लेकिन सरणी के प्रारूप में ही है:

$url = 'http://example.com/'; 

$options['http'] = array(
    'method' => "HEAD", 
    'ignore_errors' => 1, 
); 

$context = stream_context_create($options); 

$body = file_get_contents($url, NULL, $context); 

$responses = parse_http_response_header($http_response_header); 

$code = $responses[0]['status']['code']; // last status code 

echo "Status code (after all redirects): $code<br>\n"; 

$number = count($responses); 

$redirects = $number - 1; 

echo "Number of responses: $number ($redirects Redirect(s))<br>\n"; 

if ($redirects) 
{ 
    $from = $url; 

    foreach (array_reverse($responses) as $response) 
    { 
     if (!isset($response['fields']['LOCATION'])) 
      break; 
     $location = $response['fields']['LOCATION']; 
     $code = $response['status']['code']; 

     echo " * $from -- $code --> $location<br>\n"; 
     $from = $location; 
    } 
    echo "<br>\n"; 
} 

/** 
* parse_http_response_header 
* 
* @param array $headers as in $http_response_header 
* @return array status and headers grouped by response, last first 
*/ 
function parse_http_response_header(array $headers) 
{ 
    $responses = array(); 
    $buffer = NULL; 
    foreach ($headers as $header) 
    { 
     if ('HTTP/' === substr($header, 0, 5)) 
     { 
      // add buffer on top of all responses 
      if ($buffer) array_unshift($responses, $buffer); 
      $buffer = array(); 

      list($version, $code, $phrase) = explode(' ', $header, 3) + array('', FALSE, ''); 

      $buffer['status'] = array(
       'line' => $header, 
       'version' => $version, 
       'code' => (int) $code, 
       'phrase' => $phrase 
      ); 
      $fields = &$buffer['fields']; 
      $fields = array(); 
      continue; 
     } 
     list($name, $value) = explode(': ', $header, 2) + array('', ''); 
     // header-names are case insensitive 
     $name = strtoupper($name); 
     // values of multiple fields with the same name are normalized into 
     // a comma separated list (HTTP/1.0+1.1) 
     if (isset($fields[$name])) 
     { 
      $value = $fields[$name].','.$value; 
     } 
     $fields[$name] = $value; 
    } 
    unset($fields); // remove reference 
    array_unshift($responses, $buffer); 

    return $responses; 
} 

अधिक जानकारी के लिए देखें: HEAD first with PHP Streams, अंत में यह उदाहरण कोड शामिल कैसे आप कर सकते हैं get_headers के साथ हीड अनुरोध करें।

संबंधित: How can one check to see if a remote file exists using PHP?

+0

संबंधित: [PHP: get_headers अस्थायी stream_context सेट करें] (http://stackoverflow.com/questions/8429342/php-get-headers-set- समकालीन- स्ट्रीम-context) – hakre

संबंधित मुद्दे