[PHP] Utilisation de fsockopen pour vérification d'url

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics


mr_go
WRInaute accro
WRInaute accro
 
Messages: 1945
Inscription: Mer Sep 21, 2005 16:02

[PHP] Utilisation de fsockopen pour vérification d'url

Message le Ven Fév 03, 2006 15:24

Bonjour les amis,

est ce que quelqu'un saurait coment faire pour récupérer le code de retour d'une page précise en php.

Je sais que fsockopen fonctionne pour un NDD, mais à priori il ne semble pas fonctionner avec une page en particulier.

Exemple :

Code: Tout sélectionner
$fp = fsockopen('www.example.com', 80, $errno, $errstr, 30);
if (!$fp) {
   echo "ERREUR ($errno)";
}


fonctionne
Code: Tout sélectionner
$fp = fsockopen('www.example.com/rep1/index.html', 80, $errno, $errstr, 30);
if (!$fp) {
   echo "ERREUR ($errno)";
}

Ne fonctionne pas...

Une idée? Une source?

Merki d'avance ;)


biddybulle
WRInaute accro
WRInaute accro
 
Messages: 1470
Inscription: Lun Mai 30, 2005 21:55

Message le Ven Fév 03, 2006 15:44

lit son contenu

et si tu n arrive pas à lire alors tu met un 404


mr_go
WRInaute accro
WRInaute accro
 
Messages: 1945
Inscription: Mer Sep 21, 2005 16:02

Message le Ven Fév 03, 2006 15:58

J'y ai pensé mais le problème c'est que je veux tester le code erreur réel, qui n'est pas que 404.

shrom
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Lun Juil 05, 2004 22:37

Message le Ven Fév 03, 2006 16:14

Tu devrais plutôt regarder du côté du module curl qui est en général disponible sur les hébergements, ce sera plus rapide et aussi plus simple à mettre en oeuvre.

Code: Tout sélectionner
$c = curl_init();
curl_setopt( $c, CURLOPT_URL, $url );
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt( $c, CURLOPT_CONNECTTIMEOUT, 5 );
$r = curl_exec( $c );
$infos = curl_getinfo( $c );
$error = curl_error( $c );
$errno = curl_errno( $c );
curl_close( $c );
   
if ( $infos['http_code'] != 200 ) {
    if ( $errno != 0 ) {
   $error = 'Erreur lors de la récupération de la page: '.$error;
    }
    else {
        $error = 'Erreur lors de la récupération de la page: code '.$infos['http_code'];
    }
}


rottman
WRInaute accro
WRInaute accro
 
Messages: 2097
Inscription: Mar Jan 06, 2004 20:11

Message le Ven Fév 03, 2006 16:24

function check_connect($host,$path)
//verifie la validite de l'adresse, c'est a dire on regarde si le site existe bien...
//on rend dans un tableau :
// "statut" : 0 si KO, 1 si redirect ou bien pour faire passer en local, 2 si OK
// "code" : code HTTP
// "message" : message
{
if(!TEST_URL)
//si on travaille en local, on ne se connecte pas
{
$tab_return["statut"] = 1;
$tab_return["code"] = 0;
$tab_return["message"] = "<font color=\"#ff9900\">Pas de test de connexion</font>\n";
return $tab_return;
}
$connect = 0;
$no_code = 0;
//connexion par socket
if ($fp = @fsockopen($host,80))
{
//traitement du path
if(substr($path,strlen($path)-1) != '/')
{
if(!ereg("\.",$path))
$path .= "/";
}
//envoi de la requete HTTP
fputs($fp,"GET ".$path." HTTP/1.1\r\n");
fputs($fp,"Host: ".$host."\r\n");
fputs($fp,"Connection: close\r\n\r\n");
//on lit le fichier
$line = fread($fp,255);
$en_tete = $line;
//on lit tant qu'on n'est pas la fin du fichier ou qu'on trouve le debut du code html...
while (!feof($fp) && !ereg("<",$line) )
{
$en_tete .= $line;
$line = fread($fp,255);
}
fclose($fp);
//on switch sur le code HTTP renvoye
$no_code = substr($en_tete,9,3);
switch ($no_code)
{
// 2** la page a été trouvée
case 200 : $message = "OK";
$color = "#33cc00";
$connect = 2;
break;
case 204 : $message = "Cette page ne contient rien! (204)";
$color = "#ff9966";
break;
case 206 : $message = "Contenu partiel de la page! (206)";
$color = "#ff9966";
break;
// 3** il y a une redirection
case 301 : $message = "La page a été déplacéé définitivement! (301)";
$message .= seek_redirect_location($en_tete);
$color = "#ff9966";
$connect = 1;
break;
case 302 : $message = "La page a été déplacéé momentanément! (302)";
$message .= seek_redirect_location($en_tete);
$color = "#ff9966";
$connect = 1;
break;
// 4** erreur du coté du client
case 400 : $message = "Erreur dans la requête HTTP! (400)";
$color = "#ff0000";
break;
case 401 : $message = "Authentification requise! (401)";
$color = "#ff0000";
break;
case 402 : $message = "L'accès à la page est payant! (402)";
$color = "#ff0000";
break;
case 403 : $message = "Accès à la page refusé! (403)";
$color = "#ff0000";
break;
case 404 : $message = "Page inexistante! (404)";
$color = "#ff0000";
break;
// 5** erreur du coté du serveur
case 500 : $message = "Erreur interne au serveur! (500)";
$color = "#ff0000";
$connect = 1;
break;
case 502 : $message = "Erreur à cause de la passerelle du serveur! (502)";
$color = "#ff0000";
break;
// cas restant
default : $message = "Erreur non traitée dont le numéro est : $no_code!";
$color = "#000000";
break;
}
}
else
{
$message = "Impossible de se connecter par socket";
$color = "#ff0000";
}
//creation du tableau avec les valeurs a rendre
$data_return["statut"] = $connect; //la page est OK ou KO (200 => OK sinon KO)
$data_return["code"] = $no_code; //code HTTP renvoye
$data_return["message"] = "<font color=\"".$color."\">".$message."</font>\n"; //message a afficher
return $data_return;
}


Dixit phpmyannu ;)


mr_go
WRInaute accro
WRInaute accro
 
Messages: 1945
Inscription: Mer Sep 21, 2005 16:02

Message le Ven Fév 03, 2006 16:50

Thx je teste ;)


mr_go
WRInaute accro
WRInaute accro
 
Messages: 1945
Inscription: Mer Sep 21, 2005 16:02

Message le Ven Fév 03, 2006 17:01

Merci beaucoup!

Il manquait juste la fonction appelée, seek_redirect_location...

Mais bon je vais pas faire le difficile!

Merci ca marche nickel...
bon Week end à tous ;)

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Ven Fév 03, 2006 18:32

Cela permet également de teste si un nom de domaine est déjà existant ?

shrom
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Lun Juil 05, 2004 22:37

Message le Ven Fév 03, 2006 22:13

thierry8 a écrit:Cela permet également de teste si un nom de domaine est déjà existant ?


Non, car un nom de domaine n'est pas forcément relié à un site web, si tu veux savoir si un nom de domaine existe ou nom, il faut interroger un serveur whois.

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Ven Fév 03, 2006 22:17

Et n'est-il pas possible de le faire sous forme php ?

shrom
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Lun Juil 05, 2004 22:37

Message le Sam Fév 04, 2006 13:04

thierry8 a écrit:Et n'est-il pas possible de le faire sous forme php ?


Si bien sûr, avec fsockopen ou curl, il faut connaitre le protocole pour interroger les serveurs whois.

Sinon, il y a un module PEAR Net_whois qui permet de le faire.

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Sam Fév 04, 2006 13:46

Est-ce que quelqu'un qui l'utilise ou utilise une autre méthode pourrait me guider... Parce que si je demande c'est que je suis pomé et que je n'ai pas du tout comment faire...


J'ai lu cela:http://www.go-pear.org/manual/fr/package.networking.net-whois.query.php

Mais ça ne m'avance pas plus..
Si l'on pouvait faire un cas pratique: (ou c'est trop compliqué pour partagé ? dans ce cas je comprendrais, mais dites le de manière que je le sache)

EDIT 1:
Sur cette page je l'ai téléchargé:
-http://pear.php.net/package/Net_Whois/

EDIT 2:
Je précise que je ne souhaite pas afficher le whois, mais uniquement vérifier si un nom de domaine existe, de façon fiable. Merci


Bourriquet
WRInaute passionné
WRInaute passionné
 
Messages: 635
Inscription: Lun Sep 19, 2005 22:10

Message le Sam Fév 04, 2006 16:07

Pour avoir le code de retour exact d'une page, il faut simplement effectuer une requête HTTP de type HEAD...

fsockopen ouvre simplement une connexion, si tu n'envoie rien, c'est normal que tu n'ai rien en retour. Pour envoyer, il faut que tu utilises fwrite.

Ensuite, tu récupère tes données avec fread.

Voilà un exemple qui marche en PHP :
-http://phptrust.org/tools/

Marche uniquement avec PHP et les fonctions fsockopen, fread, fwrite, et fclose.

Pour vérifier qu'un nom de domaine n'existe pas, il suffit simplement de faire un whois sur le nom de domaine.

On peut le faire très simplement en faisant :

Code: Tout sélectionner
$prout = `whois nomdedomaine.com`;


Cela lance un whois sous linux, et retourne le résultat dans $prout. Il reste juste à traiter la chaine.

A noter que sur certaines machines, avec un vieux whois, il faut lui indiquer le serveur à interroger, mais ça c'est pas dur, il suffit de détecter l'extention, et de prendre un serveur parmi la liste des serveurs des registry.


Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par Julien Coquet, expert certifié officiellement par Google Analytics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités