How can I check if a URL exists via PHP?

前端 未结 22 1200
天涯浪人
天涯浪人 2020-11-22 04:13

How do I check if a URL exists (not 404) in PHP?

相关标签:
22条回答
  • 2020-11-22 05:13

    the simple way is curl (and FASTER too)

    <?php
    $mylinks="http://site.com/page.html";
    $handlerr = curl_init($mylinks);
    curl_setopt($handlerr,  CURLOPT_RETURNTRANSFER, TRUE);
    $resp = curl_exec($handlerr);
    $ht = curl_getinfo($handlerr, CURLINFO_HTTP_CODE);
    
    
    if ($ht == '404')
         { echo 'OK';}
    else { echo 'NO';}
    
    ?>
    
    0 讨论(0)
  • 2020-11-22 05:14
    $headers = @get_headers($this->_value);
    if(strpos($headers[0],'200')===false)return false;
    

    so anytime you contact a website and get something else than 200 ok it will work

    0 讨论(0)
  • 2020-11-22 05:15

    When figuring out if an url exists from php there are a few things to pay attention to:

    • Is the url itself valid (a string, not empty, good syntax), this is quick to check server side.
    • Waiting for a response might take time and block code execution.
    • Not all headers returned by get_headers() are well formed.
    • Use curl (if you can).
    • Prevent fetching the entire body/content, but only request the headers.
    • Consider redirecting urls:
    • Do you want the first code returned?
    • Or follow all redirects and return the last code?
    • You might end up with a 200, but it could redirect using meta tags or javascript. Figuring out what happens after is tough.

    Keep in mind that whatever method you use, it takes time to wait for a response.
    All code might (and probably will) halt untill you either know the result or the requests have timed out.

    For example: the code below could take a LONG time to display the page if the urls are invalid or unreachable:

    <?php
    $urls = getUrls(); // some function getting say 10 or more external links
    
    foreach($urls as $k=>$url){
      // this could potentially take 0-30 seconds each
      // (more or less depending on connection, target site, timeout settings...)
      if( ! isValidUrl($url) ){
        unset($urls[$k]);
      }
    }
    
    echo "yay all done! now show my site";
    foreach($urls as $url){
      echo "<a href=\"{$url}\">{$url}</a><br/>";
    }
    

    The functions below could be helpfull, you probably want to modify them to suit your needs:

        function isValidUrl($url){
            // first do some quick sanity checks:
            if(!$url || !is_string($url)){
                return false;
            }
            // quick check url is roughly a valid http request: ( http://blah/... ) 
            if( ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(\.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url) ){
                return false;
            }
            // the next bit could be slow:
            if(getHttpResponseCode_using_curl($url) != 200){
    //      if(getHttpResponseCode_using_getheaders($url) != 200){  // use this one if you cant use curl
                return false;
            }
            // all good!
            return true;
        }
        
        function getHttpResponseCode_using_curl($url, $followredirects = true){
            // returns int responsecode, or false (if url does not exist or connection timeout occurs)
            // NOTE: could potentially take up to 0-30 seconds , blocking further code execution (more or less depending on connection, target site, and local timeout settings))
            // if $followredirects == false: return the FIRST known httpcode (ignore redirects)
            // if $followredirects == true : return the LAST  known httpcode (when redirected)
            if(! $url || ! is_string($url)){
                return false;
            }
            $ch = @curl_init($url);
            if($ch === false){
                return false;
            }
            @curl_setopt($ch, CURLOPT_HEADER         ,true);    // we want headers
            @curl_setopt($ch, CURLOPT_NOBODY         ,true);    // dont need body
            @curl_setopt($ch, CURLOPT_RETURNTRANSFER ,true);    // catch output (do NOT print!)
            if($followredirects){
                @curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,true);
                @curl_setopt($ch, CURLOPT_MAXREDIRS      ,10);  // fairly random number, but could prevent unwanted endless redirects with followlocation=true
            }else{
                @curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,false);
            }
    //      @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,5);   // fairly random number (seconds)... but could prevent waiting forever to get a result
    //      @curl_setopt($ch, CURLOPT_TIMEOUT        ,6);   // fairly random number (seconds)... but could prevent waiting forever to get a result
    //      @curl_setopt($ch, CURLOPT_USERAGENT      ,"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1");   // pretend we're a regular browser
            @curl_exec($ch);
            if(@curl_errno($ch)){   // should be 0
                @curl_close($ch);
                return false;
            }
            $code = @curl_getinfo($ch, CURLINFO_HTTP_CODE); // note: php.net documentation shows this returns a string, but really it returns an int
            @curl_close($ch);
            return $code;
        }
        
        function getHttpResponseCode_using_getheaders($url, $followredirects = true){
            // returns string responsecode, or false if no responsecode found in headers (or url does not exist)
            // NOTE: could potentially take up to 0-30 seconds , blocking further code execution (more or less depending on connection, target site, and local timeout settings))
            // if $followredirects == false: return the FIRST known httpcode (ignore redirects)
            // if $followredirects == true : return the LAST  known httpcode (when redirected)
            if(! $url || ! is_string($url)){
                return false;
            }
            $headers = @get_headers($url);
            if($headers && is_array($headers)){
                if($followredirects){
                    // we want the last errorcode, reverse array so we start at the end:
                    $headers = array_reverse($headers);
                }
                foreach($headers as $hline){
                    // search for things like "HTTP/1.1 200 OK" , "HTTP/1.0 200 OK" , "HTTP/1.1 301 PERMANENTLY MOVED" , "HTTP/1.1 400 Not Found" , etc.
                    // note that the exact syntax/version/output differs, so there is some string magic involved here
                    if(preg_match('/^HTTP\/\S+\s+([1-9][0-9][0-9])\s+.*/', $hline, $matches) ){// "HTTP/*** ### ***"
                        $code = $matches[1];
                        return $code;
                    }
                }
                // no HTTP/xxx found in headers:
                return false;
            }
            // no headers :
            return false;
        }
    
    0 讨论(0)
  • 2020-11-22 05:15
    $url = 'http://google.com';
    $not_url = 'stp://google.com';
    
    if (@file_get_contents($url)): echo "Found '$url'!";
    else: echo "Can't find '$url'.";
    endif;
    if (@file_get_contents($not_url)): echo "Found '$not_url!";
    else: echo "Can't find '$not_url'.";
    endif;
    
    // Found 'http://google.com'!Can't find 'stp://google.com'.
    
    0 讨论(0)
提交回复
热议问题