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 :
Chargement du fichier
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);
}
?>
Afficher le résultat
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");
}
}
?>
Exemple de code
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 : FALSEIl 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.