2013-04-02 15 views
13

Zastanawiam się, czy istnieje jakiś dobry skrypt PHP (biblioteki), aby sprawdzić, czy link jest zepsuty? Mam linki do dokumentów w tabeli mysql i może po prostu sprawdzić, czy link prowadzi do dokumentu, lub czy jestem przekierowany do innego adresu URL. Dowolny pomysł? Wolałbym to zrobić w PHP.Sprawdź, czy linki są uszkodzone w php

mogą być związane z: Check link works and if not visually identify it as broken

+0

Powiązany temat wydaje się dość trafny. – Kermit

+3

sprawdź nagłówki odpowiedzi, używając curl i opublikuj kod z określonym problemem. – Ejaz

+0

Czy jest to link do niektórych treści w Twojej witrynie lub treści na innej stronie? – Touch

Odpowiedz

24

Można sprawdzić niedziałający link korzystania z tej funkcji:

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

Trzeba mieć CURL zainstalowane dla tej pracy. Teraz można sprawdzić linki z wykorzystaniem:

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

również sprawdzić ten link do kodów stanu HTTP: HTTP Status Codes

myślę, że można także sprawdzić 301 i 302 kodów stanu.

Inną metodą byłoby użycie funkcji get_headers. Ale to działa tylko wtedy, gdy wersja PHP jest większy niż 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); 
} 

W tym przypadku po prostu sprawdzić dane wyjściowe:

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

nadzieję, że to pomaga :).

+0

Czy można to zrobić z bazy danych? Lista powiązanych dokumentów będzie musiała zostać zaktualizowana w miarę dodawania i usuwania nowego dokumentu. Myślę, że dla naszych pracowników trudno byłoby ręcznie zaktualizować skrypt za każdym razem, gdy nastąpi zmiana? BTW dziękuję za odpowiedź, daje mi miejsce do rozpoczęcia. – StenW

+1

Jeśli chcesz zaktualizować bazę danych, wpisz zapytanie, które spowoduje pobranie informacji, a następnie skorzystaj z linków i sprawdź za pomocą php i zaktualizuj je ponownie. – Sabari

+0

Należy uważać, aby 301 nie przekierowywał do 402. Lub strona jest 402 , ale wypluwając 301. Jak teraz wiem, że ta strona jest wyłączona, ale zwraca 301. W pewnym momencie zwróciłem 402. Ale powyższy kod uważa, że ​​strona jest ważna i wzwyż, kiedy nie jest. –

2

Jak szybkiej kontroli obejścia można użyć zmiennej globalnej $http_response_header z file_get_contents() funkcji.

Na przykład (wyciąg z dokumentacji PHP):

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

Następnie sprawdzić kod statusu w pierwszej linii na "HTTP/1.1 200 OK" lub inne HTTP status codes.

+0

To nie jest dobry pomysł. Niektóre instalacje PHP wyświetlają ostrzeżenia, jeśli serwer nie zostanie znaleziony lub nie odpowiada .... – idmean

+0

Nie powinieneś używać display_errors lub error_reporting w serwerach produkcyjnych. Można również użyć operatora @ silence lub register_shutdown_function http://php.net/manual/es/function.register-shutdown-function.php dla błędów catch – shakaran

1

Spróbuj tego:

$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

Można to zrobić na kilka sposobów:

Pierwszy sposób - curl

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

Drugi sposób - jeśli nie masz curl zainstalowane - Get nagłówki

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

Thi rd sposób - fopen

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

First & second solutions

+1

Który sposób jest najszybszy i mniej spragniony zasobów? – danyo

+0

co to jest uchwyt $ w trzeciej metodzie? @Orel Biton – NomanJaved