Проверка Url на работоспособность

dimasik

Новичок
Проверка Url на работоспособность

Как мне проверить URL на работоспособность, т.е. битая ссылка или нет...
Или есть скрипт уже такой???:rolleyes:
 

point

Новичок
Средствами ПХП ? Сходить fopen-ом или curl-ом, сделав HEAD запрос.
 

point

Новичок
> а вот как fopen сделать HEAD запрос - я не в курсе.

Имелось в виду fopen или curl+HEAD.

:) 1000 и 1 способ забрать страницу.
4й - exec + wget :)
 

dimasik

Новичок
Вооо, нашел такой вот скриптик, отлично работает:)
PHP:
function json($var) {
  switch (gettype($var)) {
    case 'boolean':
      return $var ? 'true' : 'false'; // Lowercase necessary!
    case 'integer':
    case 'double':
      return $var;
    case 'resource':
    case 'string':
      return '"'. str_replace(array("\r", "\n", "<", ">", "&"),
                              array('\r', '\n', '\x3c', '\x3e', '\x26'),
                              addslashes($var)) .'"';
    case 'array':    
      if (empty ($var) || array_keys($var) === range(0, sizeof($var) - 1)) {
        $output = array();
        foreach ($var as $v) {
          $output[] = json($v);
        }
        return implode(', ', $output);
      }
      // Otherwise, fall through to convert the array as an object.
    case 'object':
      $output = array();
      foreach ($var as $k => $v) {
        $output[] = json(strval($k)) .': '. json($v);
      }
      return implode(', ', $output) ;
    default:
      return 'null';
  }
}

function unique_urls($urls) {
  $uurls = array();
  for ($i=0; isset($urls[$i]); $i++) {   
    if (!in_array($urls[$i], $uurls)) {
      $uurls[] = $urls[$i];
    }
  }
  return $uurls;
}


function get_head($url, $timeout = 1) {

  $info = @parse_url($url);
  $fp = @fsockopen($info["host"], 80, $errno, $errstr, $timeout);

  if (!$fp) {
     return false;
  }
  // Checks the path is not empty
  if (empty($info["path"])) {
    // If it is empty it fills it
    $info["path"] = "/";
  }
  $query = ""; 
    
  if (isset( $info["query"] ) ) {
    $query = "?".$info["query"]."";
  }
  
  $out  = "HEAD ".$info["path"]."".$query." HTTP/1.0\r\n";
  $out .= "Host: ".$info["host"]."\r\n";
  $out .= "Connection: close \r\n" ;
  $out .= "User-Agent: jQuery_LinkChecker/1.1\r\n\r\n";
  
  // write the headers out
  fwrite($fp, $out);
  $html = '';
  

  while (!feof($fp) ) {
    $html .= fread($fp,8192);
  }
  //echo $html . '<br><br>';
  //flush();
  // Closes socket
  fclose( $fp );
  
  return $html;
}

// Get status code
function get_status($header) {

  $headers = explode( "\r\n", $header );
  unset( $header );
  
  if (preg_match("/HTTP\/[0-9A-Za-z +]/i" ,$headers[0])) {   
    $status = preg_replace( "/http\/[0-9]\.[0-9]/i", "", $headers[0] );
    return $status;
  } else {
    return 'Unknown status';
  }
  
}

function url_exists($url, $timeout = 1) {
  $html = get_head($url, $timeout);
  if(empty($html)) {
    return false;
  }   

  $status = get_status($html);
  
  if(strpos($status, '200 OK') !== FALSE) {
    return true;
  }
    
  return false;
}

  //В $str пишем URL
function checkLink($str)
 {
  $link[] = $str; 
  if(isset($link)) {
  $links = unique_urls($link); 
  $result = Array();
  foreach ($links as $l)
   {
    $result[] = array(url_exists($l, 1) ? true : false);
   }
  }
  if(json($result)=="false")
  {return false;}else{return true;}
 }
 

Wicked

Новичок
непонятно только зачем нужно было тянуть функцию json ради одной проверки, которую также можно сделать без json'а :)
 

Beavis

Banned
dimasik
а если в заголовке ответа будет 301-ый статус, урл разве не существует?
 

dimasik

Новичок
я же говорю что нашел этот скрипт в дебрях нета, я его не писал
 

Sepuka

Новичок
На мой взгляд лучший способ это get_headers($url, 1);
Т.к. очень удобно посмотреть куда перемещен, тип контента... А вот вытаскивать сам текст страницы уже curl'ом. Это я говорю потому, что долго использовал fsockopen(), но так и не разобрался с таймаутами... Бывает что зависает при соединении с хостом и все тут, если хоста нет и т.п. Если кто знает как правильно устанавливать таймаут, напишите пожалуйста.
p.s. пробовал stream_set_timeout и т.п.
 
Сверху