كيف يمكنني التحقق من روابط صالحة (وليس ميتة) بشكل برمجي باستخدام PHP؟

StackOverflow https://stackoverflow.com/questions/244506

  •  05-07-2019
  •  | 
  •  

سؤال

بالنظر إلى قائمة عناوين URL ، أود أن أتحقق من أن كل عنوان URL:

  • إرجاع رمز الحالة 200 OK
  • إرجاع استجابة خلال X مقدار الوقت

الهدف النهائي هو نظام قادر على وضع علامة على عناوين URL على أنه محتمل محتمل حتى يتمكن المسؤول من مراجعته.

سيتم كتابة البرنامج النصي في PHP وسيتم تشغيله على الأرجح يوميًا عبر CRON.

سيقوم البرنامج النصي بمعالجة ما يقرب من 1000 عناوين URL عند التنقل.

السؤال له جزءان:

  • هل هناك أي مسكات كبيرة مع عملية مثل هذه ، ما هي المشكلات التي واجهتها؟
  • ما هي أفضل طريقة للتحقق من حالة عنوان URL في PHP بالنظر إلى كل من الدقة والأداء؟
هل كانت مفيدة؟

المحلول

استخدم امتداد PHP Curl. على عكس FOPEN () ، يمكن أيضًا تقديم طلبات HTTP Head التي تكفي للتحقق من توفر عنوان URL وتوفير الكثير من النطاق الترددي حيث لا تضطر إلى تنزيل مجموعة كاملة من الصفحة للتحقق.

كنقطة انطلاق ، يمكنك استخدام بعض الوظائف مثل هذه:

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

ومع ذلك ، هناك الكثير من التحسينات المحتملة: قد ترغب في إعادة استخدام مثيل الضفيرة ، وإذا تم التحقق من أكثر من عنوان URL لكل مضيف ، حتى إعادة استخدام الاتصال.

أوه ، وهذا الرمز يتحقق بدقة لرمز استجابة HTTP 200. لا يتبع إعادة التوجيه (302)-ولكن هناك أيضًا خيار حليقة لذلك.

نصائح أخرى

انظر إلى حليقة. هناك مكتبة ل PHP.

هناك أيضًا نسخة قابلة للتنفيذ من Curl حتى تتمكن من كتابة البرنامج النصي في Bash.

لقد كتبت بالفعل شيئًا في PHP يقوم بذلك على قاعدة بيانات بعنوان URL 5K+. لقد استخدمت فئة الكمثرى http_request, التي لها طريقة تسمى GetResponsecode(). أنا أتكرر فقط على عناوين URL ، وأمرها إلى رمز الرمز وتقييم الاستجابة.

ومع ذلك ، فإنه لا يعمل مع عناوين FTP ، عناوين URL التي لا تبدأ بـ HTTP أو HTTPS (غير مؤكد ، لكنني أعتقد أن هذا هو الحال) ، والمواقع ذات شهادات أمان غير صالحة (لم يتم العثور على 0). أيضا ، يتم إرجاع 0 لخادم لا يوجد (لا يوجد رمز حالة لذلك).

وربما يكون الأمر أسهل من حليقة حيث تقوم بتضمين بعض الملفات واستخدام وظيفة واحدة لاستعادة رمز عدد صحيح.

  1. FOPEN () يدعم HTTP URI.
  2. إذا كنت بحاجة إلى مزيد من المرونة (مثل المهلة) ، فابحث في امتداد حليقة.

يبدو أنه قد يكون وظيفة ل لفة.

إذا لم تكن عالقًا في PHP Perl's LWP ، فقد تكون إجابة أيضًا.

يجب أن تكون أيضًا على دراية بعناوين URL التي تعود إلى 301 أو 302 من استجابات HTTP التي تعيد التوجيه إلى صفحة أخرى. بشكل عام هذا لا يعني أن الرابط غير صالح. فمثلا، http://amazon.com يعيد 301 ويعيد التوجيه إلى http://www.amazon.com/.

مجرد إعادة استجابة 200 لا يكفي ؛ ستستمر العديد من الروابط الصالحة في إرجاع "200" بعد أن تتحول إلى بوابات الإباحية / المقامرة عندما يفشل المالك السابق في التجديد.

عادة ما تضمن مستقطعي المجال أن كل عنوان URL في مجالاتهم يعود 200.

إحدى المشكلات المحتملة التي ستواجهها بلا شك هي عندما يتم تشغيل هذا البرنامج النصي عند الوصول إلى الوصول إلى الإنترنت ... ستحصل على 1000 إيجابي كاذب.

من المحتمل أن يكون من الأفضل أن يحتفظ البرنامج النصي الخاص بك بالاحتفاظ بنوع من التاريخ والتقارير فقط عن الفشل بعد 5 أيام من الفشل.

أيضًا ، يجب أن يكون البرنامج النصي ذاتيًا بطريقة ما (مثل التحقق من موقع ويب جيد معروف [Google؟]) قبل المتابعة مع الشيكات القياسية.

تحتاج فقط إلى نص باش للقيام بذلك. يرجى التحقق من إجابتي في منشور مماثل هنا. إنه خط واحد يعيد استخدام اتصالات HTTP لتحسين السرعة بشكل كبير ، ويحدد أوقات N للأخطاء المؤقتة ويتبع إعادة التوجيه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top