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

PHP

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é? Ce problème est essentiel quand on écrit un script pour le Web.

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.

Voir aussi