Comment vérifier et tester si un site est en ligne en PHP ?

Réponses rédigées par Antoine
Dernière mise à jour : 2018-08-27 14:40:27
Thèmes : script - php - curl - webmaster
Question

Comment puis-je vérifier et tester si un site est en ligne, ou si une URL est valide en PHP ?

Réponse

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";
}
Réponse

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