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

WRInaute passionné
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:
$fp = fsockopen('www.example.com', 80, $errno, $errstr, 30);
if (!$fp) {
   echo "ERREUR ($errno)";
}

fonctionne
Code:
$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 ;)
 
WRInaute passionné
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.
 
WRInaute impliqué
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:
$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'];
    }
}
 
WRInaute passionné
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 ;)
 
WRInaute passionné
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 ;)
 
WRInaute impliqué
thierry8 a dit:
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.
 
WRInaute impliqué
thierry8 a dit:
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.
 
WRInaute accro
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
 
WRInaute impliqué
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:
$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.
 
Discussions similaires
Haut