2010-04-27 2 views
1

Ok, j'ai une liste d'URL dans une table MySQL. Je veux que le script vérifie automatiquement chaque lien dans la table pour 404, et ensuite je veux qu'il stocke si l'URL a été 404 ou non, ainsi que de stocker une heure pour la dernière vérification.Vérification automatique d'URL à partir d'une table MySQL

Est-ce même possible de faire automatiquement, même si personne ne lance le script? Par exemple, personne ne visite la page pendant quelques jours, mais même si personne ne visite la page, le test est automatiquement exécuté.

Si c'est possible, comment pourrais-je faire un bouton pour faire cela?

Répondre

2

Pas besoin d'utiliser CURL, file_get_contents($url); retourne false si la requête échoue (tout autre code HTTP autre que 2xx), ce qui pourrait être plus utile pour ce que vous essayez de faire, par exemple:

function urlExists($url) 
{ 
    return (bool) @file_get_contents($url); 
} 

Va retourner vrai si l'URL renvoie un contenu utile, faux sinon.


EDIT: Voici une façon plus rapide (il demande que les en-têtes) et le premier octet au lieu de la page entière:

function urlExists($url) 
{ 
    return (bool) @file_get_contents($url, false, null, 0, 1); 
} 

urlExists('https://stackoverflow.com/iDontExist'); // false 

Cependant, en combinaison avec your other question il peut être plus sage d'utiliser quelque chose comme ceci:

function url($url) 
{ 
    return @file_get_contents($url); 
} 

$content = url('https://stackoverflow.com/'); 

// request has failed (404, 5xx, etc...) 
if ($content === false) 
{ 
    // delete or store as "failed" in the DB 
} 

// request was successful 
else 
{ 
    $hash = md5($content); // md5() should be enough but you can also use sha1() 

    // store $hash in the DB to keep track of changes 
} 

Ou si vous utilisez PHP 5.1+ vous suffit de faire:

$hash = @md5_file($url); 

$hash sera fausse lorsque l'URL ne se charge pas, sinon elle retournera le hachage MD5 du contenu.

Gracieusement stolen from @Jamie. =)

De cette façon, il suffit de faire une requête au lieu de deux. =)

+0

Désolé pour la réponse tardive. Été un peu occupé. Merci beaucoup, @ md5_file(); c'est génial. Pouvez-vous me dire cependant, à quoi sert le '@' devant la fonction? – Rob

+0

Rob: Est d'éviter la fonction pour lancer des erreurs si l'URL ne se charge pas. –

+0

Donc, si je le mets dans mon curl_multi_exec (comme dans @curl_multi_exec();), il va exécuter toutes les urls indépendamment des erreurs? (Voir ma question ouverte pour plus d'informations) – Rob

1

Vous utiliseriez un travail cron pour cela. En utilisant un travail cron que vous choisissez lorsque le script est exécuté, par exemple. toutes les heures, toutes les 6 heures, etc.

Pour vérifier 404, vous pouvez parcourir les URL et utiliser get_headers pour mettre à jour une ligne d'état à chaque fois.

0

Essayez d'utiliser curl:

// $url <= The URL from your database 
$curl = curl_init($url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
$curl_response = curl_exec($curl); 
if(curl_getinfo($curl, CURLINFO_HTTP_CODE) == 404) 
{ 
    // Save in database. 
} 
curl_close($curl); 

Si vous exécutez sur un serveur d'hébergement partagé, rechercher la possibilité de mettre en place des actions chronométrées (emplois Cron). Certains services d'hébergement l'ont, d'autres non.

0

Je recommanderais d'utiliser curl aussi bien, mais faire HEAD demande au lieu de GET:

<?php 
function check_url($url) { 
    $c = curl_init(); 
    curl_setopt($c, CURLOPT_URL, $url); 
    curl_setopt($c, CURLOPT_HEADER, 1); // get the header 
    curl_setopt($c, CURLOPT_NOBODY, 1); // and *only* get the header 
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // get the response as a string from curl_exec(), rather than echoing it 
    curl_setopt($c, CURLOPT_FRESH_CONNECT, 1); // don't use a cached version of the url 
    if (!curl_exec($c)) { return false; } 

    $httpcode = curl_getinfo($c, CURLINFO_HTTP_CODE); 
    return $httpcode; 
} 
?> 

Snipplet pris de here.

L'exécution récurrente peut être réalisée par la commande * nix cron.

Questions connexes