2008-10-28 6 views
15

यूआरएल की एक सूची को देखते हुए, मैं एक यूआरएल है कि जाँच करने के लिए चाहते हैं एक प्रणाली जो संभावित रूप से टूटी हुई यूआरएल को ध्वजांकित करने में सक्षम है ताकि एक प्रशासक उनकी समीक्षा कर सके।PHP का उपयोग करके प्रोग्रामेटिक रूप से वैध (मृत नहीं) लिंक की जांच कैसे करूं?</p> <ul> <li></li> <li>समय</li> </ul> <p>अंतिम लक्ष्य है की एक्स राशि के भीतर जवाब देता है एक 200 ठीक स्थिति कोड देता है:

लिपि PHP में लिखा जाएगा और संभवतः क्रॉन के माध्यम से दैनिक आधार पर चलाया जाएगा।

स्क्रिप्ट एक बार में लगभग 1000 यूआरएल संसाधित करेगा।

प्रश्न के दो भाग हैं:

  • वहाँ इस तरह के ऑपरेशन के साथ किसी भी bigtime gotchas रहे हैं, क्या मुद्दों आप में चलाने है?
  • सटीकता और प्रदर्शन दोनों पर विचार करते हुए PHP में यूआरएल की स्थिति की जांच करने के लिए सबसे अच्छी विधि क्या है?
+0

200 एकमात्र अच्छा कोड नहीं है। 3xx का एक कोड रीडायरेक्शन का मतलब है, और कई मामलों में, जो पृष्ठ आप चाहते हैं वह वह जगह है जहां आपको लाया जाता है (लेकिन इसकी गारंटी नहीं है)। 401 जरूरी नहीं है कि "बुरा" हो, लेकिन यह 200 नहीं है। –

+0

आपको सावधान रहना चाहिए कि एक ही वेबसाइट को लगातार हथियार न दें या [मालिक परेशान हो सकता है] (http://blog.stackoverflow.com/2008/10/लिपि-जिम्मेदारी से /)। शायद सूची को सॉर्ट करें, और उसी साइट से कई यूआरएल के लिए अगले अनुरोध से पहले कुछ प्रकार की देरी करें (या किसी अन्य साइट पर जाएं और बाद में उस पर वापस आएं)। – Kip

उत्तर

18

PHP कर्ल एक्सटेंशन का उपयोग करें। Fopen() के विपरीत यह HTTP HEAD अनुरोध भी कर सकता है जो यूआरएल की उपलब्धता की जांच करने के लिए पर्याप्त हैं और आपको बैंडविड्थ का एक टन बचाता है क्योंकि आपको पृष्ठ के पूरे शरीर को जांचने के लिए डाउनलोड नहीं करना पड़ता है।

एक प्रारंभिक बिंदु के रूप में आप इस तरह की कुछ समारोह इस्तेमाल कर सकते हैं:

function is_available($url, $timeout = 30) { 
    $ch = curl_init(); // get cURL handle 

    // set cURL options 
    $opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser 
        CURLOPT_URL => $url,   // set URL 
        CURLOPT_NOBODY => true,   // do a HEAD request only 
        CURLOPT_TIMEOUT => $timeout); // set timeout 
    curl_setopt_array($ch, $opts); 

    curl_exec($ch); // do it! 

    $retval = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; // check if HTTP OK 

    curl_close($ch); // close handle 

    return $retval; 
} 

हालांकि, वहाँ संभव अनुकूलन के एक टन है: आप cURL उदाहरण फिर से उपयोग कर सकते हैं और यदि एक से अधिक URL की जाँच प्रति होस्ट, कनेक्शन का पुनः उपयोग भी करें।

ओह, और यह कोड HTTP प्रतिक्रिया कोड 200 के लिए कड़ाई से जांच करता है। यह रीडायरेक्ट (302) का पालन नहीं करता है - लेकिन इसके लिए एक कर्ल-विकल्प भी है।

2
  1. fopen() का समर्थन करता है http यूआरआई।
  2. यदि आपको अधिक लचीलापन (जैसे टाइमआउट) की आवश्यकता है, तो curl एक्सटेंशन में देखें।
+0

fopen() का उपयोग न करें - यह रीडायरेक्ट और ऐसे का समर्थन नहीं करता है। –

6

cURL में देखो। PHP के लिए एक पुस्तकालय है।

वहाँ भी cURL की एक निष्पादन योग्य संस्करण है तो आप भी बैश में स्क्रिप्ट लिख सकते हैं। जब बॉक्स इस स्क्रिप्ट पर चल रहा है इंटरनेट का उपयोग करने खो देता है

0

एक संभावित समस्या आप undoubtably में चलेंगे है ... आप 1000 झूठे सकारात्मक मिलेगा।

यह शायद अपनी स्क्रिप्ट के लिए बेहतर होगा इतिहास के कुछ प्रकार रखने के लिए और केवल विफलता के 5 दिनों के बाद एक विफलता रिपोर्ट।

इसके अलावा, स्क्रिप्ट स्वयं जाँच किसी तरह से (एक ज्ञात अच्छा वेब साइट की जाँच की तरह [गूगल?]) मानक चेकों के साथ जारी रखने से पहले किया जाना चाहिए।

+0

हाँ, अंत आवेदन के लिए एक प्रमुख इतिहास घटक है। मैंने सादगी के लिए सवाल से बाहर छोड़ा। इसके अलावा, कुछ अच्छी जांच करना अच्छा यूआरएल एक अच्छा विचार है। धन्यवाद। :) – GloryFish

4

मैंने वास्तव में PHP में कुछ लिखा जो यह 5k + URL के डेटाबेस पर करता है। मैंने पीयर क्लास HTTP_Request का उपयोग किया, जिसमें getResponseCode() नामक एक विधि है। मैं सिर्फ यूआरएल पर पुनरावृत्ति करता हूं, उन्हें रीस्पॉन्सकोड प्राप्त करने और प्रतिक्रिया का मूल्यांकन करने के लिए पास करता हूं।

हालांकि, यह एफ़टीपी पते, यूआरएल के लिए काम नहीं करता है जो http या https से शुरू नहीं होता है (पुष्टि नहीं है, लेकिन मुझे विश्वास है कि यह मामला है), और अमान्य सुरक्षा प्रमाणपत्र वाली साइटें (0 नहीं मिली है)। साथ ही, सर्वर के लिए 0 लौटाया गया है-नहीं मिला (इसके लिए कोई स्टेटस कोड नहीं है)।

और यह शायद कर्ल की तुलना में आसान है क्योंकि आप कुछ फाइलें शामिल करते हैं और एक पूर्णांक कोड को वापस पाने के लिए एक एकल फ़ंक्शन का उपयोग करते हैं।

1

लगता है जैसे कि यह curl के लिए एक नौकरी हो सकता है।

यदि आप PHP पर्ल के एलडब्लूपी पर फंस गए नहीं हैं तो भी इसका जवाब हो सकता है।

+0

एलडब्ल्यूपी के लिए आमीन। पर्ल बेहतर अनुकूल है, क्योंकि इसमें कोई टाइमआउट भी शामिल नहीं है। उल्लेख नहीं है, यह चट्टानों। :) – willasaywhat

1

आपको 301 या 302 HTTP प्रतिक्रियाओं को लौटने वाले यूआरएल के बारे में भी पता होना चाहिए जो किसी अन्य पृष्ठ पर रीडायरेक्ट करते हैं। आम तौर पर इसका मतलब यह नहीं है कि लिंक अमान्य है। उदाहरण के लिए, http://amazon.com 301 लौटाता है और http://www.amazon.com/ पर रीडायरेक्ट करता है।

1

बस 200 प्रतिक्रिया लौटने पर्याप्त नहीं है; जब पूर्व मालिक नवीकरण करने में विफल रहता है तो कई वैध लिंक अश्लील/जुआ पोर्टल में बदलने के बाद "200" वापस लौटते रहेंगे।

डोमेन निवासियों पर नज़र रखती आम तौर पर यह सुनिश्चित करें कि उनके डोमेन में हर URL मिलता है 200

+0

यह एक असली चिंता भी है। अच्छे (या खराब) यूआरएल की जांच करना एक छोटी सी समस्या नहीं है। –

0

आप केवल एक bash स्क्रिप्ट की जरूरत है यह करने के लिए। कृपया एक ही पोस्ट here पर मेरा उत्तर देखें। यह एक-लाइनर है जो गतिशील रूप से गति में सुधार करने के लिए HTTP कनेक्शन का उपयोग करता है, अस्थायी त्रुटियों के लिए एन बार पुनः प्रयास करता है और रीडायरेक्ट का पालन करता है।

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