2013-04-02 2 views
13

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

может быть связано с: Check link works and if not visually identify it as broken

+0

Связанная тема кажется довольно актуальной. – Kermit

+3

проверить заголовки ответов, используя curl, и опубликовать свой код с конкретной проблемой – Ejaz

+0

Является ли эта ссылка для некоторого контента на вашем веб-сайте или на другом сайте? – Touch

ответ

24

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

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 Status Codes

Я думаю, вы также можете проверить 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"; 

Надеется, что это помогает вам :).

+0

Возможно ли это сделать из базы данных? Список связанных документов необходимо будет обновить по мере добавления и снятия нового документа. Я думаю, что для наших сотрудников было бы немного сложно вручную обновить сценарий каждый раз, когда произойдут изменения? КТО благодарю вас за ваш ответ, заставляет меня начать свое дело. – StenW

+1

Если вы хотите обновить базу данных, напишите какой-либо запрос, который извлекает информацию, а затем берет ссылки из нее и проверяет с помощью php и обновляет их обратно. – Sabari

+0

Будьте осторожны, чтобы 301 не перенаправлялся на 402. Или сайт был 402 , но выплевывает 301. Как сейчас, я знаю, что этот сайт не работает, но возвращает 301. В какой-то момент у меня было 402. Но вышеприведенный код считает, что сайт действителен и вверх, когда это не так. –

2

Как быстро проверить обходной, вы можете использовать глобальную переменную $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 status codes.

+0

Это не очень хорошая идея. Некоторые PHP-установки отображают предупреждения, если сервер не найден или не отвечает .... – idmean

+0

Вы не должны использовать display_errors или error_reporting на рабочих серверах. Также можно использовать оператор @ silence или register_shutdown_function http://php.net/manual/es/function.register-shutdown-function.php для ошибок catch – shakaran

1

Попробуйте это:

$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); 
4

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

Первый путь - завиток

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

Thi й путь - Еореп

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

First & second solutions

+1

Какой способ является самым быстрым и менее ресурсоемким? – danyo

+0

Что такое $ handle в третьем методе? @Orel Biton – NomanJaved

Смежные вопросы