طريقة سهلة لاختبار عنوان URL لـ 404 في PHP؟



Answers

إذا كان php5 الخاص بك قيد التشغيل ، يمكنك استخدام:

$url = 'http://www.example.com';
print_r(get_headers($url, 1));

بدلاً من ذلك ، باستخدام php4 ، ساهم أحد المستخدمين بما يلي:

/**
This is a modified version of code from "stuart at sixletterwords dot com", at 14-Sep-2005 04:52. This version tries to emulate get_headers() function at PHP4. I think it works fairly well, and is simple. It is not the best emulation available, but it works.

Features:
- supports (and requires) full URLs.
- supports changing of default port in URL.
- stops downloading from socket as soon as end-of-headers is detected.

Limitations:
- only gets the root URL (see line with "GET / HTTP/1.1").
- don't support HTTPS (nor the default HTTPS port).
*/

if(!function_exists('get_headers'))
{
    function get_headers($url,$format=0)
    {
        $url=parse_url($url);
        $end = "\r\n\r\n";
        $fp = fsockopen($url['host'], (empty($url['port'])?80:$url['port']), $errno, $errstr, 30);
        if ($fp)
        {
            $out  = "GET / HTTP/1.1\r\n";
            $out .= "Host: ".$url['host']."\r\n";
            $out .= "Connection: Close\r\n\r\n";
            $var  = '';
            fwrite($fp, $out);
            while (!feof($fp))
            {
                $var.=fgets($fp, 1280);
                if(strpos($var,$end))
                    break;
            }
            fclose($fp);

            $var=preg_replace("/\r\n\r\n.*\$/",'',$var);
            $var=explode("\r\n",$var);
            if($format)
            {
                foreach($var as $i)
                {
                    if(preg_match('/^([a-zA-Z -]+): +(.*)$/',$i,$parts))
                        $v[$parts[1]]=$parts[2];
                }
                return $v;
            }
            else
                return $var;
        }
    }
}

سيكون لكل منهما نتيجة مشابهة لما يلي:

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
)

لذلك يمكنك فقط التحقق من أن استجابة العنوان كانت على ما يرام على سبيل المثال:

$headers = get_headers($url, 1);
if ($headers[0] == 'HTTP/1.1 200 OK') {
//valid 
}

if ($headers[0] == 'HTTP/1.1 301 Moved Permanently') {
//moved or redirect page
}

رموز W3C وتعريفات

Question

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

لذلك أحتاج إلى اختبار في أعلى الشفرة للتحقق مما إذا كان عنوان URL يرجع إلى 404 أم لا.

قد يبدو هذا وكأنه مهمة بسيطة جدًا ، ولكن Google لا تقدم لي أي إجابات. أنا قلق من أنني أبحث عن الأشياء الخاطئة.

أوصت مدونة واحدة باستخدام هذا:

$valid = @fsockopen($url, 80, $errno, $errstr, 30);

ثم اختبر لمعرفة ما إذا كان $ صالحًا إذا كان فارغًا أم لا.

ولكنني أعتقد أن عنوان URL الذي يعطيني مشكلات هو أنه يحتوي على إعادة توجيه ، لذا فإن قيمة $ $ صالحة فارغة لكل القيم. أو ربما أفعل شيئًا آخر خاطئًا.

لقد بحثت أيضًا في "طلب الرأس" ولكني لم أجد بعد أي أمثلة فعلية على الشفرة التي يمكنني اللعب بها أو تجربتها.

اقتراحات؟ وماذا عن الضفيرة؟




اختبار ؛ اختبار هذه الأساليب 3 النظر في الأداء.

النتيجة ، على الأقل في بيئة الاختبار الخاصة بي:

يفوز الضفيرة

يتم إجراء هذا الاختبار تحت اعتبار أنه لا يلزم سوى الرؤوس (noBody). اختبر نفسك:

$url = "http://de.wikipedia.org/wiki/Pinocchio";

$start_time = microtime(TRUE);
$headers = get_headers($url);
echo $headers[0]."<br>";
$end_time = microtime(TRUE);
echo $end_time - $start_time."<br>";


$start_time = microtime(TRUE);
$response = file_get_contents($url);
echo $http_response_header[0]."<br>";
$end_time = microtime(TRUE);
echo $end_time - $start_time."<br>";

$start_time = microtime(TRUE);
$handle = curl_init($url);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle, CURLOPT_NOBODY, 1); // and *only* get the header 
/* Get the HTML or whatever is linked in $url. */
$response = curl_exec($handle);
/* Check for 404 (file not found). */
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
// if($httpCode == 404) {
    // /* Handle 404 here. */
// }
echo $httpCode."<br>";
curl_close($handle);
$end_time = microtime(TRUE);
echo $end_time - $start_time."<br>";



هذا سوف يعطيك true إذا كان عنوان URL لا يرجع 200 OK

function check_404($url) {
   $headers=get_headers($url, 1);
   if ($headers[0]!='HTTP/1.1 200 OK') return true; else return false;
}



كما اقترح strager ، ابحث في استخدام cURL. قد تكون مهتمًا أيضًا بتعيين CURLOPT_NOBODY باستخدام curl_setopt لتخطي تنزيل الصفحة بأكملها (تحتاج فقط إلى الرؤوس).




<?php

$url= 'www.something.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);   
curl_setopt($ch, CURLOPT_NOBODY, true);    
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.4");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);


echo $httpcode;
?>



هذا هو مجرد شريحة من الرموز ، ويعمل الأمل بالنسبة لك

            $ch = @curl_init();
            @curl_setopt($ch, CURLOPT_URL, 'http://example.com');
            @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
            @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            @curl_setopt($ch, CURLOPT_TIMEOUT, 10);

            $response       = @curl_exec($ch);
            $errno          = @curl_errno($ch);
            $error          = @curl_error($ch);

                    $response = $response;
                    $info = @curl_getinfo($ch);
return $info['http_code'];



لقد وجدت هذه الإجابة here :

if(($twitter_XML_raw=file_get_contents($timeline))==false){
    // Retrieve HTTP status code
    list($version,$status_code,$msg) = explode(' ',$http_response_header[0], 3);

    // Check the HTTP Status code
    switch($status_code) {
        case 200:
                $error_status="200: Success";
                break;
        case 401:
                $error_status="401: Login failure.  Try logging out and back in.  Password are ONLY used when posting.";
                break;
        case 400:
                $error_status="400: Invalid request.  You may have exceeded your rate limit.";
                break;
        case 404:
                $error_status="404: Not found.  This shouldn't happen.  Please let me know what happened using the feedback link above.";
                break;
        case 500:
                $error_status="500: Twitter servers replied with an error. Hopefully they'll be OK soon!";
                break;
        case 502:
                $error_status="502: Twitter servers may be down or being upgraded. Hopefully they'll be OK soon!";
                break;
        case 503:
                $error_status="503: Twitter service unavailable. Hopefully they'll be OK soon!";
                break;
        default:
                $error_status="Undocumented error: " . $status_code;
                break;
    }

بشكل أساسي ، تستخدم طريقة "الحصول على محتويات الملف" لاسترداد عنوان URL ، الذي يقوم تلقائيًا بملء متغير رأس استجابة http مع رمز الحالة.




Links