PHP: Comment lire le code d'état HTTP d'une page Web?

PHP

Comment vos pages sont vues par les robots des moteures de recherche? Comment quand on veut accéder à distance par un script, aux pages d'un site, savoir si une page existe, s'il s'agit d'une redirection, si un lien est brisé?

Voici une fonction définie pour obtenir ce code d'état, basé sur une fonction PHP, fsockopen, compatible avec les versions actuelles de PHP. Un script est fourni pour en montrer l'utilisation, qui répond à des règles strictes.

Utiliser fsockopen

On utilise la fonction avec deux paramètres:
- L'URL du site, sans nom de fichier, par exemple: www.scriptol.fr.
- Un nom de fichier, avec éventuellement un répertoire.

Le domaine est passé en paramètre lors de l'appel de la fonction.

$server = "www.example.com"
$fp=fsockopen($server,80,$errno,$errstr,30);

Sans protocole ajouté, la fonction utilise TCP par défaut. On pourrait spécifier tcp://www.scriptol.fr ou udp://www.scriptol.fr.

Le second paramètre est le port, généralement 80, les deux suivants servent à récupérer le numéro et le message d'erreur éventuels. Le dernier est le temps d'attente maximal accordé pour obtenir une réponse, en millisecondes.

Une fois la connexion ouverte, on effectue la requête. Il s'agit dans notre cas d'accéder à un fichier, d'où la commande GET:

$page = "index.php"
$out="GET /$page HTTP/1.1\r\n"; 
$out.="Host: $server\r\n"; 
$out.="Connection: Close\r\n\r\n";
fwrite($fp,$out);

On spécifie la page, le serveur et l'on referme la connexion. Mais le fichier est obtenu ainsi que les en-têtes HTTP.

Pour récuperer ces données, on utilise la fonction fgets:

$content=fgets($fp);

On obtient une ligne de la forme:

HTTP/1.1 200 Ok

si le fichier est trouvé. Si l'URL est une redirection ce sera:

HTTP/1.1 301 Moved Permanently

Tandis que le code 404 indique que la page n'existe pas.

Ne reste qu'a extraire le code avec la fonction substr comme cela est fait dans le script donné ci-dessous.

Code source

Le code source du script a été testé avec ce site. Remplacer "www.scriptol.fr" par l'URL de votre site (sans / à la fin ni nom de fichier mais optionnellement avec le protocole tcp://).
De même remplacer le nom des pages par des pages de votre site, avec ou sans répertoire.

Script complet

Voici un script qui réalise le test, envoie une requête à l'URL que vous indiquez et affiche le code retourné par le serveur. Un formulaire est inclut dans l'archive pour entrer l'URL et un script JavaScript pour lancer le script PHP, sur un serveur distant ou local.

Code source

function sockAccess($server, $page) {
$errno="";
$errstr="";
$fp=0;
$fp=fsockopen($server, 80, $errno, $errstr, 30);
if($fp===0){
die("Error $errstr ($errno)");
}
$out="GET /$page HTTP/1.1\r\n";
$out.="Host: $server\r\n";
$out.="Connection: Close\r\n\r\n";
fwrite($fp,$out);
$content = "";
$counter = 0;
while (!feof($fp) && $counter < 8) {
$line = trim(fgets($fp, 128));
if($counter == 0) {
$code=trim(substr($line,9,4));
$content = "<strong>Code retour: $code ";
$label = "";
switch(intval($code)) {
case 200: $label= " OK ";break;
case 301: $label= " Redirection permanente"; break;
case 302: $label= " Redirection temporaire"; break;
case 404: $label= " Page non trouvée"; break;
default:break;
} $content.= $label."</strong><br><br>";
}
$content .= $line . "<br>";
$counter++;
}
fclose($fp);
return $content;
}
$url = $_POST['url'];
$parsed = parse_url($url);
$server = $parsed['host'];
$page = $parsed['path'];
$content=sockAccess($server, $page);
print_r($content);

Télécharger

Voir aussi