© Quesaco. Dernier ajout dans cette rubrique : 1er juin 2005.
Pour un esprit équilibré, la mort n'est qu'une grande aventure de plus. Joanne Rowling
Le fichier browscap.ini (browser capabilities) permet de dresser un inventaires des capacités du navigateur WEB utilisé sur le poste client. Pour l’utiliser directement en PHP avec get_browser (), il faut installer ce fichier sur le serveur Apache/PHP et indiquer sa présence dans le fichier de configuration de PHP (php.ini). Comment faire si ce fichier est absent de la configuration de votre hébergeur ?
Pour les néophytes en la matière, browscap.ini est un fichier au format texte - sorte de base de données - qui référence de nombreux outils de navigation (le navigateur ou browser) et les robots (crawler), en décrivant les propriétés pour chacun grâce à l’identification de l’en-tête Agent Utilisateur HTTP (ce que l’on obtient par la constante PHP : $_SERVER[’HTTP_USER_AGENT’]).
La dernière version de browscap.ini est disponible sur le site de Gary Keith qui fait un travail remarquable en maintenant ce fichier qui décrit plusieurs centaines de profils.
L’appel à la fonction PHP get_browser () permet d’identifier les capacités du navigateur client. Il est ainsi possible de détecter rapidement à la réception de la requête HTTP, quel est le navigateur, sa version, sa capacité à interpréter javascript, les applets java, mais aussi d’identifier le type de l’ordinateur bien plus finement qu’en lançant une batterie de tests en javascript plus au moins efficace.
Attention toutefois : les capacités identifiées ne signifient la disponibilité de ces capacités. L’utilisateur peut très bien avoir désactivé les cookies ou javascript dans les préférences de son navigateur.
get_browser () ne renvoie les informations correctes que si ce fichier browscap.ini fait partie de la configuration du serveur Apache/PHP. Si l’administrateur n’a pas mis à la bonne place ce fichier et le paramétrage système qui convient, get_browser () ne vous renverra que l’en-tête parfois accompagné d’un superbe message d’erreur, ce qui est de bien peu d’utilité. Autant utiliser directement $_SERVER[’HTTP_USER_AGENT’]).
Il est possible également de copier le fichier browscap.ini dans votre répertoire WEB et de le parcourir localement à l’aide de quelques fonctions PHP. En voici un exemple :
La fonction kzo_browscap_load () charge le fichier dont le nom est donné en paramètre et renvoie un tableau contenant toutes les données lues dans l’ordre d’arrivée.
<?php
function kzo_browscap_base_load ($filename) {
if ($handle = fopen ($filename, "r")) {
while (!feof ($handle)) {
$line = trim (fgets($handle, 1024));
if (!empty ($line) && ereg ("^[^;].*$", $line)) {
// ni ligne vide, ni commentaire
if (
// ligne de déclaration entre crochets []
ereg ("^[[].*[]]$", $line)) {
$key = substr ($line, 1, strlen ($line) - 2);
while (!feof ($handle)) {
// la suite sont les capacités,
$line = trim (fgets($handle, 1024));
if (empty ($line)) {
// si ligne vide, fin du définition
break;
} else if (ereg ("^[^;].*$", $line)) {
list ($attrib, $value) = split ("=", $line);
if (!empty ($attrib) && !empty ($value)) {
if (eregi ("true", $value)) $value = TRUE;
else if (eregi ("false", $value)) $value = FALSE;
if (!isset ($browscap[$key])) {
$browscap[$key] = array ();
}
$browscap[$key][$attrib] = $value;
}
}
} // end while
}
}
} // end while
fclose ($handle);
} else return (FALSE);
return ($browscap);
}
?>
Afficher la base des Agents Utilisateurs HTTP
Pour afficher le résultat du chargement du fichier browscap.ini au format HTML, une fonction comme kzo_browscap_base_dump () donnera satisfaction :
<?php
function kzo_browscap_base_dump ($browscap) {
foreach ($browscap as $key => $datas) {
print (htmlentities ($key) . " <br /><ul>");
if (is_array ($datas)) {
foreach ($datas as $attrib => $value) {
print (
"<li>"
. htmlentities ($attrib)." = "
. (is_bool ($value)
? ($value ? "TRUE" : "FALSE") : htmlentities ($value))
. "</li>\n");
}
}
print ("</ul>\n");
}
}
?>
Recherche l’en-tête dans la base des Agents Utilisateurs HTTP
Une simple fonction de recherche sur les clés du tableau $browscap renvoie le résultat :
<?php
function kzo_browscap_search ($needle, $browscap) {
foreach ($browscap as $key => $array) {
if (fnmatch ($key, $needle)) {
break;
}
}
$result = $browscap[$key];
if (isset ($result['parent']) && isset ($browscap[$result['parent']])) {
foreach ($browscap[$result['parent']] as $key => $value) {
$result[$key] = $value;
}
}
return ($result);
}
?>
Une dernière fonction pour afficher le résultat :
<?php
function kzo_browscap_show ($capabilities) {
foreach ($capabilities as $key => $value) {
print ("<strong>".(htmlentities ($key))."</strong> : "
. (is_bool ($value) ?
($value ? "TRUE" : "FALSE")
: htmlentities ($value))."<br />\n");
}
}
?>
Et enfin, un dernier exemple de code qui fait appel aux fonctions précédentes pour identifier et afficher les capacités du navigateur utilisé :
<?php
$browscap = array (); // la base browscap
$filename = "php_browscap.ini"; // le fichier browscap
// charge la base
if (!$filename && !($browscap = kzo_browscap_base_load ($filename))) {
die ("File: ".$filename." unreadable");
}
// votre USER AGENT
$user_agent = $_SERVER['HTTP_USER_AGENT'];
// recherche dans la base
$browser_capabilities = kzo_browscap_search ($user_agent, $browscap);
// affiche le résultat
kzo_browscap_show ($browser_capabilities);
?>
Voici en exemple le résultat pour Firefox où l’on voit que javascript est activé :
parent : Mozilla 1.8
platform : WinXP
browser : "Mozilla"
version : 1.8
majorver : 1
minorver : 8
css : 2
frames : TRUE
iframes : TRUE
tables : TRUE
cookies : TRUE
backgroundsounds : FALSE
vbscript : FALSE
javascript : TRUE
javaapplets : TRUE
activexcontrols : FALSE
cdf : FALSE
aol : FALSE
beta : TRUE
win16 : FALSE
crawler : FALSE
stripper : FALSE
wap : FALSE
netclr : FALSE
Il est finalement assez simple de découvrir les propriétés et les capacités du navigateur. Pour les principales :
parent : famille du navigateur et sa génération (numéro de version) ;
platform : environnement informatique ;
version : version du navigateur ;
css : version CSS supportée ;
backgroundsounds : possibilité de fond sonore ;
cdf : support du flux multimédia (Channel Definition Format) ;
vbscript, javascript, javaapplets, activexcontrols : l’un ou plusieurs de ces éléments est supporté.
Vous pouvez ainsi optimiser votre site en mettant à disposition pour chaque navigateur, l’information qu’il attend dans le format qu’il peut traiter.