2013-04-02 16 views
13

Mi chiedo se esiste un buon script PHP (librerie) per verificare se il collegamento è interrotto? Ho collegamenti a documenti in una tabella mysql e potrei eventualmente controllare se il link porta a un documento, o se sono reindirizzato a un altro URL. Qualche idea? Preferirei farlo in PHP.Verifica se i collegamenti sono interrotti in php

potrebbe essere correlato a: Check link works and if not visually identify it as broken

+0

L'argomento correlato sembra piuttosto rilevante. – Kermit

+3

controlla le intestazioni di risposta usando curl e inserisci il tuo codice con un problema specifico – Ejaz

+0

Questo link è per alcuni contenuti sul tuo sito web o contenuti su un altro sito web? – Touch

risposta

24

È possibile verificare la presenza di link interrotto utilizzare questa funzione:

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

È necessario avere installato CURL per questo lavoro. Ora è possibile verificare la presenza di collegamenti interrotti utilizzando:

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

controllare anche questo link per codici di stato HTTP: HTTP Status Codes

Penso che si può anche verificare la presenza di 301 e 302 codici di stato.

Anche un altro metodo sarebbe utilizzare la funzione get_headers. Ma questo funziona solo se la vostra versione di PHP è superiore a 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); 
} 

In questo caso basta controllare l'output:

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

Spero che questo ti aiuta :).

+0

È possibile farlo dal database? L'elenco dei documenti collegati dovrà essere aggiornato man mano che i nuovi documenti vengono aggiunti e tolti. Penso che sarebbe un po 'difficile per il nostro staff aggiornare manualmente lo script ogni volta che c'è un cambiamento? A proposito, grazie per la risposta, mi ha dato un punto di partenza. – StenW

+1

Se si desidera aggiornare il database, scrivere alcune query che recuperano le informazioni e quindi prendere i collegamenti da quello e controllare utilizzando php e aggiornarli di nuovo – Sabari

+0

Attenzione che 301 non sta reindirizzando a 402. O il sito è un 402 , ma sputando un 301. Come adesso so che questo sito è inattivo, ma restituisce un 301. A un certo punto ho avuto 402 restituiti. Ma il codice sopra pensa che il sito sia valido e attivo, quando non lo è. –

2

Come rapido controllo soluzione, è possibile utilizzare la variabile globale $http_response_header con file_get_contents() la funzione.

Per esempio (estratto dalla documentazione di PHP):

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

quindi controllare il codice di stato in prima linea per un "HTTP/1.1 200 OK" o altro HTTP status codes.

+0

Non è una buona idea. Alcune installazioni PHP mostrano avvisi se il server non viene trovato o non risponde ... – idmean

+0

Non si dovrebbe usare display_errors o error_reporting nei server di produzione. Puoi anche utilizzare l'operatore @ silence o register_shutdown_function http://php.net/manual/es/function.register-shutdown-function.php per gli errori di cattura – shakaran

1

Prova questo:

$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

È possibile farlo in diversi modi:

Primo modo - ricciolo

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

Secondo modo - se non avete ricciolo installati - semplicemente le intestazioni

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

Thi rd modo - fopen

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

First & second solutions

+1

Qual è il modo più veloce e meno assetato di risorse? – danyo

+0

che cos'è $ handle nel terzo metodo? @Orel Biton – NomanJaved

Problemi correlati