Comment vérifier et tester si un site est en ligne en PHP ?
Comment puis-je vérifier et tester si un site est en ligne, ou si une URL est valide en PHP ?
Il existe plusieurs méthodes pour vérifier l’existence et la validité d'une adresse Web en PHP.
Cette fonction utilise CURL pour déterminer si le serveur qui héberge un nom de domaine répond :
function onlineCheck($site){
$timeout = 10;
$curlInit = curl_init($site);
curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,$timeout);
curl_setopt($curlInit,CURLOPT_HEADER,true);
curl_setopt($curlInit,CURLOPT_NOBODY,true);
curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);
$reponse = curl_exec($curlInit);
curl_close($curlInit);
if ($reponse) return true;
return false;
}
if(onlineCheck('google.com')){echo "en ligne";}
Vous pouvez également utiliser GET_HEADERS qui retourne toutes les en-têtes envoyées par le serveur en réponse à une requête HTTP. On peut ainsi vérifier qu'un site existe, ainsi que vérifier la nature de la réponse, et donc par exemple détecter une erreur 404.
$adresse = "http://www.test.com/test.php";
$file_headers = @get_headers($adresse);
if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found')
{
echo "$adresse ne réponde pas ou retourne une erreur 404";
}
else
{
echo "$adresse est correctement accessible";
}
Une autre méthode consiste à utiliser FOPEN pour essayer d'ouvrir la page cible et ainsi vérifier que le site, ou la page, existe bel et bien sur le serveur :
ini_set("default_socket_timeout","05");
set_time_limit(5);
$f=fopen("http://www.exemple.com","r");
$r=fread($f,1000);
fclose($f);
if(strlen($r)>1)
{
echo("site en ligne");
}
else
{
echo("site hors ligne");
}
Si vous avez besoin de tester l'accessibilité à un site sur un numéro de port spécifique ou faire la distinction entre une requête TCP et UDP, vous pouvez utiliser FSOCKETOPEN :
$socket = fsockopen("udp://192.168.0.1", 80, $errno, $errstr, 10);
if (!$socket)
{
echo "en UDP le port 80 ne répond pas";
}
Il est également possible de vérifier qu'un nom de domaine répond vis à vis des DNS.
Pour cela il faut utiliser la fonction checkdnsrr() dont voici un exemple :
function domaine($domaine)
{
if(!checkdnsrr($domaine,"MX")&& !checkdnsrr($domaine,"A"))
echo "Ce nom de domaine n'existe pas";
else
echo "Ce nom de domaine existe";
}
domaine("google.com");
On peut aussi modifier quelque peu la fonction pour vérifier si le nom de domaine associé à une adresse e-mail existe.
function email_domaine($email)
{
list($compte,$domaine)= explode("@",$email,2);
if(!checkdnsrr($domaine,"MX")&& !checkdnsrr($domaine,"A"))
echo "Le nom de domaine de cette adresse mail n'existe pas";
else
echo "Le nom de domaine de cette adresse mail existe";
}
email_domaine("contact@google.com");