Подтвердить что ты не робот

Проверьте, не связаны ли ссылки на php

Интересно, есть ли какой-нибудь хороший PHP script (библиотеки), чтобы проверить, не сломалась ли ссылка? У меня есть ссылки на документы в таблице mysql, и вы можете просто проверить, ведет ли ссылка к документу, или если я перенаправлен на другой URL. Есть идеи? Я бы предпочел сделать это в PHP.

Может быть связано с: Проверьте, работает ли ссылка, и если не визуально идентифицировать ее как неработоспособную

4b9b3361

Ответ 1

Вы можете проверить неработающую ссылку, используя эту функцию:

function check_url($url) {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    $headers = curl_getinfo($ch);
    curl_close($ch);

    return $headers['http_code'];
}

Для этого вам необходимо установить CURL. Теперь вы можете проверить неработающие ссылки, используя:

$check_url_status = check_url($url);
if ($check_url_status == '200')
   echo "Link Works";
else
   echo "Broken Link";

Также проверьте эту ссылку для кодов состояния HTTP: Коды состояния HTTP

Я думаю, вы также можете проверить коды статуса 301 и 302.

Другой метод - использовать функцию get_headers. Но это работает, только если ваша версия PHP больше 5:

function check_url($url) {
   $headers = @get_headers( $url);
   $headers = (is_array($headers)) ? implode( "\n ", $headers) : $headers;

   return (bool)preg_match('#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers);
}

В этом случае просто проверьте вывод:

if (check_url($url))
   echo "Link Works";
else
   echo "Broken Link";

Надеюсь, это поможет вам:).

Ответ 2

Вы можете сделать это несколькими способами:

Первый способ - завиток

function url_exists($url) {
    $ch = @curl_init($url);
    @curl_setopt($ch, CURLOPT_HEADER, TRUE);
    @curl_setopt($ch, CURLOPT_NOBODY, TRUE);
    @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $status = array();
    preg_match('/HTTP\/.* ([0-9]+) .*/', @curl_exec($ch) , $status);
    return ($status[1] == 200);
}

Второй способ - если у вас нет завитка - получите заголовки

function url_exists($url) {
    $h = get_headers($url);
    $status = array();
    preg_match('/HTTP\/.* ([0-9]+) .*/', $h[0] , $status);
    return ($status[1] == 200);
}

Третий путь - fopen

function url_exists($url){
    $open = @fopen($url,'r');
    if($handle !== false){
       return true;
    }else{
       return false;
    }
}

Первый и второй варианты

Ответ 3

Как быстрая обходная проверка, вы можете использовать глобальную переменную $http_response_header с file_get_contents().

Например (извлечено из документации PHP):

<?php
function get_contents() {
  file_get_contents("http://example.com");
  var_dump($http_response_header);
}
get_contents();
var_dump($http_response_header);

Затем проверьте код состояния в первой строке для "HTTP/1.1 200 OK" или других кодов состояния HTTP.

Ответ 4

Попробуйте следующее:

$url = '[your_url]';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($curl);

if ($result === false) {
    echo 'broken url';
} else {
    $newUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);

    if ($newUrl !== $url) {
        echo 'redirect to: ' . $newUrl;
    }
}
curl_close($curl);