পিএইচপি-তে 404 এর জন্য কোনও URL পরীক্ষা করার সহজ উপায়?


152

আমি নিজেকে কিছু প্রাথমিক স্ক্র্যাপিং শিখিয়েছি এবং আমি দেখতে পেয়েছি যে কখনও কখনও ইউআরএল হ'ল আমি আমার কোডটি ফিড করি 404, যা আমার বাকী সমস্ত কোডগুলিকে মাড়ায়।

সুতরাং ইউআরএল 404 ফিরে আসে কি না তা পরীক্ষা করতে আমার কোডের শীর্ষে একটি পরীক্ষা প্রয়োজন।

এটি দেখতে বেশ সোজা কাজ বলে মনে হবে তবে গুগল আমাকে কোনও উত্তর দিচ্ছে না। আমি দুশ্চিন্তা করছি আমি ভুল জিনিসগুলি অনুসন্ধান করছি।

একটি ব্লগ প্রস্তাবিত আমি এটি ব্যবহার:

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

এবং তারপরে empty বৈধ কিনা খালি কিনা তা পরীক্ষা করে দেখুন।

তবে আমি মনে করি যে URL টি আমাকে সমস্যা দিচ্ছে তাতে এটির পুনর্নির্দেশ রয়েছে, সুতরাং $ বৈধ সমস্ত মানের জন্য খালি প্রকাশিত হবে। বা সম্ভবত আমি অন্য কিছু ভুল করছি।

আমি একটি "প্রধান অনুরোধ" এও দেখেছি তবে আমি খেলতে বা চেষ্টা করতে পারি এমন কোনও আসল কোড উদাহরণ খুঁজে পাইনি।

পরামর্শ? এবং এটি কার্ল সম্পর্কে কি?

উত্তর:


276

আপনি যদি পিএইচপি-র curlবাইন্ডিং ব্যবহার করে থাকেন তবে আপনি ত্রুটি কোডটি এই জাতীয় ব্যবহার করে পরীক্ষা করতে পারেন curl_getinfo:

$handle = curl_init($url);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

/* 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. */
}

curl_close($handle);

/* Handle $response here. */

1
আমি এখনও সিআরএল-এর সাথে পরিচিত নই, সুতরাং আমি কয়েকটি ধারণাটি অনুপস্থিত। নীচে $ প্রতিক্রিয়া ভেরিয়েবলটি দিয়ে আমি কী করব? এতে কী রয়েছে?

1
@ বিফ্লোরা, আমি কোডটিতে ভুল করেছি। (এক সেকেন্ডের মধ্যে ঠিক হয়ে যাবে)) আপনি পিএইচপি এর সাইটে curl_exec এর জন্য ডকুমেন্টেশন দেখতে পারেন।
স্ট্রাগার

4
@bflora $ প্রতিক্রিয়াতে $ url এর বিষয়বস্তু থাকবে যাতে আপনি নির্দিষ্ট স্ট্রিংয়ের জন্য যা কিছু যাচাই বাছাই করতে অতিরিক্ত জিনিসগুলি করতে পারেন। আপনার ক্ষেত্রে, আপনি কেবল 404 রাষ্ট্রের বিষয়ে যত্নশীল, তাই আপনার সম্ভবত $ প্রতিক্রিয়া সম্পর্কে চিন্তা করার দরকার নেই।
বিউ সিমেনসেন

5
আপনি যদি পুরো ফাইলটি ডাউনলোড করার পরিবর্তে কেবল শিরোনামগুলি লোড করতে চান?
প্যাট্রিক

13
@ পেট্রিক তারপরে আপনাকে curl_setopt($handle, CURLOPT_NOBODY, true);রান করার আগে নির্দিষ্ট করতে হবেcurl_exec
ব্যবহারকারী user

101

যদি আপনার চলমান পিএইচপি 5 আপনি ব্যবহার করতে পারেন:

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

বিকল্পভাবে পি এম পি 4 এর সাথে একজন ব্যবহারকারী নিম্নলিখিতগুলি অবদান রেখেছেন:

/**
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
}

ডাব্লু 3 সি কোড এবং সংজ্ঞা


আমি আপনার উত্তরের কয়েকটি ফর্ম্যাটিং উন্নতি করেছি, আমি https এর সক্ষমতাতেও যুক্ত করেছি: get_headers($https_url,1,443);আমি নিশ্চিত যে এটি কার্যকর হবে যদিও এটি স্ট্যান্ডার্ড get_headers()ফাংশনে না থাকলে .. এটি পরীক্ষা করে দেখতে এবং তার জন্য একটি স্ট্যাটাসের সাথে প্রতিক্রিয়া জানাতে নির্দ্বিধায় হন।
জেমসএম-সাইটগেন

1
পিএইচপি 4-র জন্য দুর্দান্ত কাজ, তবে এই জাতীয় ক্ষেত্রে আমাদের শিরোনাম HTTP পদ্ধতি রয়েছে।
vidtige

তাহলে এটি আসলে কার্ল পদ্ধতিটি আরও দ্রুত হবে?
ফ্লাই করুন

4
লক্ষ্য ইউআরএল 404 এ পুনর্নির্দেশ করা হলে এই সমাধানটি বৈধ নয় this এক্ষেত্রে ers শিরোনামগুলি [0] একটি পুনর্নির্দেশ কোড হবে এবং চূড়ান্ত 404 কোড অ্যারে ফেরত দেওয়ার পরে কোথাও যুক্ত হবে।
রুমকয়েস

1
ফলস্বরূপ স্ট্রিং থেকে প্রকৃত কোডটি ফিল্টার করার জন্য পিএইচপি করার চেয়ে এটি আরও বেশি সমস্যার মধ্যে পড়ে, যখন কোনও স্ক্রিপ্টে স্ট্যাটাস কোডটি কেবলমাত্র পড়ার জন্য ফলাফল প্রতিধ্বনিত করার বিরোধিতা করার সাথে চেষ্টা করে।
Kzqai

37

স্ট্রারের কোড সহ, আপনি অন্যান্য কোডগুলির জন্য CURLINFO_HTTP_CODE টিও পরীক্ষা করতে পারেন। কিছু ওয়েবসাইট 404 এর প্রতিবেদন করে না, বরং তারা কেবলমাত্র একটি কাস্টম 404 পৃষ্ঠাতে পুনর্নির্দেশ করে 302 (পুনর্নির্দেশ) বা অনুরূপ কিছু ফিরে আসে। আমি প্রকৃত ফাইল (যেমন। Robots.txt) সার্ভারে বিদ্যমান কিনা তা পরীক্ষা করতে এটি ব্যবহার করেছি। স্পষ্টতই এই ধরণের ফাইলটির অস্তিত্ব থাকলে পুনর্নির্দেশের কারণ হবে না, তবে এটি যদি না থাকে তবে এটি 404 পৃষ্ঠায় পুনর্নির্দেশ করবে, যা আমি আগেই বলেছি 404 কোড নাও থাকতে পারে।

function is_404($url) {
    $handle = curl_init($url);
    curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

    /* 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);
    curl_close($handle);

    /* If the document has loaded successfully without any redirection or error */
    if ($httpCode >= 200 && $httpCode < 300) {
        return false;
    } else {
        return true;
    }
}

5
"সফল" ব্যবহার HTTP- র পরিবর্তে কোডের 404 জন্য +1 ... ব্যবহারকারী একটি পেতে পারেন 408 Request Timeout, না একটি404
Guillaume

লাইক একটি মোহন কাজ। ইবে সম্পর্কিত কোনও নিবন্ধ এখনও অনলাইনে রয়েছে কিনা তা পরীক্ষা করতে আমি এটি ব্যবহার করি।
নেরডকোভস্কি

উপরের কোডটি https এর সাথে কাজ করার প্রত্যাশাকারীদের জন্য নিম্নলিখিতগুলি যুক্ত করার চেষ্টা করুন:curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, FALSE);
হ্যামেট

তবে এটি বৈধ 302 পুনঃনির্দেশিত হলে 404 = সত্যও ফিরে আসবে?
রবার্ট সিনক্লেয়ার

22

স্ট্র্যাজারের পরামর্শ অনুসারে, সিআরএল ব্যবহার করে দেখুন। পুরো পৃষ্ঠাটি ডাউনলোড করা এড়াতে আপনি curl_setopt সহ CURLOPT_NOBODY সেট করতে আগ্রহী হতে পারেন (আপনি কেবল শিরোনাম চান)।


1
আমার উল্লেখ করার জন্য +1 ^ ডাব্লু ^ ডাব্লুপ্রো আরও দক্ষ বিকল্প বিকল্প সরবরাহ করছেন, কেবলমাত্র শিরোনামটি পরীক্ষা করা দরকার in =]
স্টারগার

16

আপনি যদি কোনও সহজ সমাধান খুঁজছেন এবং এক আপনি যা করতে চেষ্টা করতে পারেন পিএইচপি 5 তে যান

file_get_contents('www.yoursite.com');
//and check by echoing
echo $http_response_header[0];

3
বিটিডব্লিউ, যদি এটি এবং url 404 এর কাজ করে থাকে তবে একটি সতর্কতা উত্থাপিত হবে, যার ফলে আউটপুট হবে।
ক্রিস কে

to isExists = @file_get_contents ('www.yoursite.com') করা সহজ; যদি ($এক্সিজিস্ট! == সত্য) {প্রতিধ্বনি "404" দেয়}
টেবে

একবার চেষ্টা করে দেখুন, তারপরে 404 টি হ্যান্ডেল করুন
গ্রেট ক্লোর্ন

7

আমি এই উত্তরটি এখানে পেয়েছি :

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

মূলত, আপনি ইউআরএল পুনরুদ্ধার করতে "ফাইলগুলি সামগ্রী পান" পদ্ধতিটি ব্যবহার করেন, যা স্বয়ংক্রিয়ভাবে স্থিতির কোডের সাথে http প্রতিক্রিয়া শিরোনাম ভেরিয়েবলকে পপুলেট করে।


2
আকর্ষণীয় - আমি এর আগে জাদুটির আগে কখনও শুনিনি। php.net/manual/en/remitted.variables.httpresponseheader.php
ফ্র্যাঙ্ক ফার্মার

2
বিড়ম্বনা - লিঙ্কটি একটি 404
হামজাহ মালিক

6

Url 200 ওকে ঠিক না ফিরিয়ে দিলে এটি আপনাকে সত্য দেবে

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

এটি ইউআরএল-এ সাধারণ বুল চেক করতে চাইলে সিআরএল ব্যবহারের চেয়ে অনেক দ্রুত। ধন্যবাদ.
Drmzindec

5

সংযোজন; কর্মক্ষমতা বিবেচনা করে এই 3 টি পদ্ধতি পরীক্ষা করেছে।

ফলাফল, কমপক্ষে আমার পরীক্ষার পরিবেশে:

কার্ল জয়

এই পরীক্ষাটি বিবেচনার ভিত্তিতে করা হয় যে কেবলমাত্র শিরোনাম (নোবিডি) প্রয়োজন। নিজেকে যাচাই করো:

$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>";

3

দুর্দান্ত স্বীকৃত উত্তরের অতিরিক্ত ইঙ্গিত হিসাবে:

প্রস্তাবিত সমাধানের প্রকরণটি ব্যবহার করার সময়, পিএইচপি সেটিং 'ম্যাক্সেক্সেকিউশন_টাইম' এর কারণে আমি ত্রুটি পেয়েছি। সুতরাং আমি যা করেছি তা হ'ল:

set_time_limit(120);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_NOBODY, true);
$result = curl_exec($curl);
set_time_limit(ini_get('max_execution_time'));
curl_close($curl);

প্রথমে আমি সময় সীমাটিকে উচ্চতর সংখ্যায় সেকেন্ডে সেট করেছিলাম, শেষ পর্যন্ত আমি পিএইচপি সেটিংসে নির্ধারিত মানটিতে ফিরে আসি।


এইচএইচএমএমএমএম ... এছাড়াও ... আপনার কোডটি কম সংস্থান গ্রহণ করেছে কারণ আপনি সামগ্রীটি ফিরিয়ে দিচ্ছেন না ... তবুও যদি আপনি মিথ্যাতে রিটার্ন ট্রান্সফার যুক্ত করতে পারেন তবে লোকেরা যখন একাধিক কল ব্যবহার করেন তখন প্রচুর সংস্থান সংরক্ষণ করতে পারে ... নতুনরা বেশি ভাবেন না এবং তাই এটি 40 টি ভোটের কারণ ... ঠিক আছে ...
জয়পাল চন্দ্রন

3
<?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;
?>

3

এখানে একটি সংক্ষিপ্ত সমাধান দেওয়া হল।

$handle = curl_init($uri);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle,CURLOPT_HTTPHEADER,array ("Accept: application/rdf+xml"));
curl_setopt($handle, CURLOPT_NOBODY, true);
curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if($httpCode == 200||$httpCode == 303) 
{
    echo "you might get a reply";
}
curl_close($handle);

আপনার ক্ষেত্রে, আপনি application/rdf+xmlযা ব্যবহার করেন তা পরিবর্তন করতে পারেন।


2

এই ফাংশনটি পিএইচপি 7 এ কোনও URL এর স্থিতি কোডটি ফেরত দেয়:

/**
 * @param string $url
 * @return int
 */
function getHttpResponseCode(string $url): int
{
    $headers = get_headers($url);
    return substr($headers[0], 9, 3);
}

উদাহরণ:

echo getHttpResponseCode('https://www.google.com');
//displays: 200

1

যে কোনও লিঙ্কের স্থিতি দেখতে আপনি এই কোডটিও ব্যবহার করতে পারেন:

<?php

function get_url_status($url, $timeout = 10) 
{
$ch = curl_init();
// 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!
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // find HTTP status
curl_close($ch); // close handle
echo $status; //or return $status;
    //example checking
    if ($status == '302') { echo 'HEY, redirection';}
}

get_url_status('http://yourpage.comm');
?>

0

এটি কেবল এবং কোডের টুকরো, আশা আপনার জন্য কাজ করে

            $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'];

0

এখানে একটি উপায়!

<?php

$url = "http://www.google.com";

if(@file_get_contents($url)){
echo "Url Exists!";
} else {
echo "Url Doesn't Exist!";
}

?>

এই সাধারণ স্ক্রিপ্টটি কেবল তার উত্স কোডের জন্য URL- এ একটি অনুরোধ করে। অনুরোধটি সফলভাবে শেষ হলে, এটি "URL উপস্থিত রয়েছে!" আউটপুট দেবে। যদি তা না হয় তবে এটি "URL টি বিদ্যমান নয়!" আউটপুট দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.