Articles

Le mois de la fonction PHP : entêtes HTTP

  • Ecrit par Damien Seguy
  • lundi 26 mars 2007
Image pour le titre du contenu

This document is also available in English en 

Les entêtes HTTP contiennent des informations qui interessent le serveur et le navigateur. Ils intéressent aussi le programmeur PHP. Il y a alors deux types d'entêtes : ceux qui sont liés à la transaction courante, pour le serveur et pour le navigateur, et ceux qui sont associés à une requête effectuée depuis PHP.

Du point de vue PHP, on peut lire les entêtes envoyés par le navigateur avec la variable $_SERVER, notamment avec les index préfixé par HTTP. ($_SERVER[HTTP_AGENT], par exemple). On peut accéder à toute la liste des entêtes avec la fonction getallheaders(), disponible depuis PHP 4.

Pour renvoyer des entêtes via le serveur Web, il faut utiliser la fonction bien connue header(). Il y a aussi les fonctions moins connues de header_sent(), pour savoir si les entetes ont déjà été modifiées, et header_list(), pour savoir quels entêtes ont été configurés, avec leur valeur. Enfin, on a parfois besoin des informations d'entêtes HTTP sur une autre ressource que le script courant. C'est le rôle de get_headers(). Cette dernière interroge le site distant, à l'aide d'une requête classique (POST, GET, HEAD, etc) et lit uniquement les entêtes qui lui sont envoyés. Si la ressource distante est une vidéo, les entêtes représenteront quelques ko, au lieu de plusieurs centaines de mega-octets.

<?php
 print_r(get_headers('http://www.nexen.net/'));
?>

Ce script affiche :
Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Mon, 26 Mar 2007 17:00:35 GMT
    [2] => Server: Apache/1.3.33 (Debian GNU/Linux) PHP/4.4.6-0.dotdeb.2 with Suhosin-Patch
    [3] => X-Powered-By: PHP/4.4.6-0.dotdeb.2
    [4] => Set-Cookie: 5c637dbab625dce1c47987d4173f3151=a17b2656a834f89286dc5372312646cf; expires=Tue, 27 Mar 2007 05:00:36 GMT; path=/
    [5] => Expires: Mon, 26 Jul 1997 05:00:00 GMT
    [6] => Last-Modified: Mon, 26 Mar 2007 17:00:40 GMT
    [7] => Cache-Control: no-store, no-cache, must-revalidate
    [8] => Cache-Control: post-check=0, pre-check=0
    [9] => Pragma: no-cache
    [10] => Set-Cookie: current_first_level_menu=1
    [11] => Connection: close
    [12] => Content-Type: text/html; charset=iso-8859-1
)

La première version de get_headers() renvoie un tableau, avec une entrée par entête reçu. La deuxième version, obtenue avec l'option true, effectue une analyse des entêtes, et les répartis dans le tableau, avec le nom de l'entête comme clé. Le statut HTTP est alors inséré en index 0.

Array
(
    [0] => HTTP/1.1 200 OK
    [Date] => Mon, 26 Mar 2007 17:01:44 GMT
    [Server] => Apache/1.3.33 (Debian GNU/Linux) PHP/4.4.6-0.dotdeb.2 with Suhosin-Patch
    [X-Powered-By] => PHP/4.4.6-0.dotdeb.2
    [Set-Cookie] => Array
        (
            [0] => 5c637dbab625dce1c47987d4173f3151=e8e45bb6efa28553780162dd22c75871; expires=Tue, 27 Mar 2007 05:01:44 GMT; path=/
            [1] => current_first_level_menu=1
        )
    [Expires] => Mon, 26 Jul 1997 05:00:00 GMT
    [Last-Modified] => Mon, 26 Mar 2007 17:01:48 GMT
    [Cache-Control] => Array
        (
            [0] => no-store, no-cache, must-revalidate
            [1] => post-check=0, pre-check=0
        )
    [X-PHP-Load] => 2.13525390625, 1.966796875, 1.5078125
    [Content-Length] => 3515
    [Pragma] => no-cache
    [Connection] => close
    [Content-Type] => text/html; charset=iso-8859-1
)


Dans ces informations, vous trouverez pêle-mêle et optionnellement :
  • la taille du fichier attendu
  • les cookies posés
  • les informations sur le cache
  • les jeux de caractères
  • la taille du document
  • les redirections
  • Ainsi que toutes les entêtes qui pourraient être ajoutées par PHP, le script, le serveur Web ou les autres logiciels qui interviennent dans la publication.

Vous pouvez notamment vous en servir pour vérifier qu'une ressource existe, sans la télécharger. Par exemple, un head sur une image ne vous coûtera que quelques octets d'entête. Toute fois, les serveurs Web passent malgré tout la commande aux scripts PHP pour l'exécuter, car ils essaient en fait de savoir quelle taille de fichier devrait être renvoyée.

A mémoriser
get_headers() est disponible depuis PHP 5
get_headers() utilise le contexte par défaut, au lieu d'un argument optionnel. Utilisez la fonction stream_context_get_default() pour spécifier votre contexte d'exécution.
pour un flux, vous pouvez utiliser la fonction stream_get_meta_data()
en PHP 4, vous pouvez émuler cette fonction avec fsockopen()
< Précédent   Suivant >

Commentaires

Vous pouvez ajouter votre commentaire!


Vous devez vous connecter pour commenter