2010-12-14 18 views

उत्तर

24

आप से Manual:

<?php 
// By default get_headers uses a GET request to fetch the headers. If you 
// want to send a HEAD request instead, you can do so using a stream context: 
stream_context_set_default(
    array(
     'http' => array(
      'method' => 'HEAD' 
     ) 
    ) 
); 
print_r(get_headers('http://example.com')); 

// gives 
Array 
(
    [0] => HTTP/1.1 200 OK 
    [Date] => Sat, 29 May 2004 12:28:14 GMT 
    [Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux) 
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT 
    [ETag] => "3f80f-1b6-3e1cb03b" 
    [Accept-Ranges] => bytes 
    [Content-Length] => 438 
    [Connection] => close 
    [Content-Type] => text/html 
) 

पहले सरणी तत्व get_headers($url)

उदाहरण 2 का उपयोग HTTP प्रतिक्रिया स्थिति कोड में शामिल होंगे सकते हैं। आपको इसका विश्लेषण करना होगा।

ध्यान दें कि उदाहरण में get_headers फ़ंक्शन एक HTTP HEAD अनुरोध जारी करेगा, जिसका अर्थ है कि यह यूआरएल के शरीर को नहीं लाएगा। यह एक जीईटी अनुरोध का उपयोग करने से अधिक कुशल है जो शरीर को भी वापस कर देगा।

यह भी ध्यान रखें कि डिफ़ॉल्ट संदर्भ सेट करके, किसी भी स्ट्रीम कॉल का उपयोग कर किसी भी बाद की कॉल, अब HEAD अनुरोध जारी करेगा। तो पूर्ण होने पर जीईटी का उपयोग करने के लिए डिफ़ॉल्ट संदर्भ को रीसेट करना सुनिश्चित करें।

पीएचपी भी variable $http_response_header

$http_response_header सरणी get_headers() समारोह के समान है प्रदान करता है। HTTP wrapper का उपयोग करते समय, $http_response_header HTTP प्रतिक्रिया शीर्षलेखों के साथ पॉप्युलेट किया जाएगा। $http_response_header स्थानीय दायरे में बनाया जाएगा।

आप किसी दूरस्थ संसाधन की सामग्री को डाउनलोड करना चाहते हैं, तो आप दो अनुरोध करने के लिए (एक अगर संसाधन मौजूद है और एक यह लाने के लिए देखने के लिए) नहीं करना चाहते, लेकिन सिर्फ एक। उस स्थिति में, सामग्री लाने के लिए file_get_contents जैसे कुछ का उपयोग करें और फिर हेडर को चर से जांचें।

+0

संबंधित: [? कैसे एक करता है, तो एक दूरस्थ फ़ाइल PHP का उपयोग मौजूद है देखने के लिए जाँच कर सकते हैं] (http://stackoverflow.com/questions/981954/how-can-one-check-to-see-if -ए-रिमोट-फाइल-मौजूद-उपयोग-php) (के माध्यम से: [PHP स्ट्रीम के साथ पहले HEAD] (http://hakre.wordpress.com/2011/09/17/head-first-with-php-streams/)) – hakre

+0

जब यूआरएल परीक्षण किया जा रहा है, तो PHP चेतावनी को दबाने के लिए शुरुआत में एक @ वर्ण जोड़ें। इस तरह आप अपना खुद का कस्टम अपवाद फेंक सकते हैं। –

+1

@ फ्रांसिस्कोलज़ मैं त्रुटि दमन का उपयोग करने पर विचार करता हूं और उचित त्रुटि हैंडलर का उपयोग करके पक्षपात करता हूं। – Gordon

0

@ गॉर्डन - यहां आपके उत्तर के आधार पर एक और पूर्ण लाइब्रेरी दिनचर्या है। इसमें यूआरएल वैधता के लिए कुछ प्रारंभिक जांच, कुछ और त्रुटि प्रबंधन, और लौटे हेडर की पार्सिंग शामिल है। यह उचित संख्या के चरणों के लिए किसी भी रीडायरेक्ट चेन का भी पालन करता है।

class cLib { 
    static $lasterror = 'No error set yet'; 
    /** 
    * @brief See with a URL is valid - i.e. a page can be successfully retrieved from it without error 
    * @param string $url The URL to be checked 
    * @param int $nredirects The number of redirects check so far 
    * @return boolean True if OK, false if the URL cannot be fetched 
    */ 
    static function checkUrl($url, $nredirects = 0) { 
     // First, see if the URL is sensible 
     if (filter_var($url, FILTER_VALIDATE_URL) === false) { 
      self::$lasterror = sprintf('URL "%s" did not validate', $url); 
      return false; 
     } 
     // Now try to fetch it 
     $headers = @get_headers($url); 
     if ($headers == false) { 
      $error = error_get_last(); 
      self::$lasterror = sprintf('URL "%s" could not be read: %s', $url, $error['message']); 
      return false; 
     } 
     $status = $headers[0]; 
     $rbits = explode(' ', $status); 
     if (count($rbits) < 2) { 
      self::$lasterror = sprintf('Cannot parse status "%s" from URL "%s"', $status, $url); 
      return false; 
     } 
     if (in_array($rbits[1], array(301, 302, 304, 307, 308))) { 
      // This URL has been redirected. Follow the redirection chain 
      foreach ($headers as $header) { 
       if (cLib::startsWith($header, 'Location:')) { 
        if (++$nredirects > 10) { 
         self::$lasterror = sprintf('URL "%s" was redirected over 10 times: abandoned check', $url); 
         return false; 
        } 
        return self::checkUrl(trim(substr($header, strlen('Location:'))), $nredirects); 
       } 
      } 
      self::$lasterror = sprintf('URL "%s" was redirected but location could not be identified', $url); 
      return false; 
     } 
     if ($rbits[1] != 200) { 
      self::$lasterror = sprintf('URL "%s" returned status "%s"', $url, $status); 
      return false; 
     } 
     return true; 
    } 
} 
@FranciscoLuz लिए क्षमा याचना के साथ

- अगर आप उपयोगकर्ता इनपुट के आधार पर त्रुटियों की उम्मीद कर रहे हैं, "@ और error_get_last" विधि पूरी तरह से समझदार मुझे लगता है - मैं नहीं दिख रहा है वहाँ कुछ भी अधिक set_error_handler का उपयोग कर के बारे में उचित नहीं है कि ।

बीटीडब्ल्यू, यह सुनिश्चित नहीं है कि मुझे इसे एक अलग उत्तर के बजाय @ गॉर्डन के उत्तर में संपादित करने के रूप में किया जाना चाहिए था। क्या कोई सलाह दे सकता है?

0
public function isLink($url) 
{ 
    $result = false; 
    if (!filter_var($url, FILTER_VALIDATE_URL) === false) { 
     $getHeaders = get_headers($url); 
     $result = strpos($getHeaders[0], '200') !== false; 
    } 
    return $result; 
} 
संबंधित मुद्दे

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