Obtener capacidades del navegador con PHP y get_browser()

  • Por
Como obtener un listado completo de las funcionalidades y tecnologías que soporta el navegador del usuario, con programación PHP y utilizando la función get_browser() de PHP.
En este artículo vamos a mostrar un mecanismo para averiguar las capacidades del navegador del usuario con PHP. Es decir, un método para saber si el navegador soporta Javascript, CSS, iframes y cosas similares. Es un método sencillo gracias a la función de PHP get_browser(), que nos devuelve un objeto donde podemos conocer fácilmente las capacidades del browser del visitante.

En cualquier momento con PHP podemos averiguar el navegador que está utilizando el usuario con la variable de sistema de servidor $_SERVER['HTTP_USER_AGENT']. Pero esta variable nos ofrece una información que no es del todo fácil de interpretar. Por ejemplo, en Internet Explorer 7, esa variable tendrá un valor como este:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

Si utilizamos Firefox en el mismo ordenador, al ver el contenido de esa variable obtendremos algo como esto:

Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10

En realidad a partir de esa información y poniendo un poco de nuestra parte, podríamos deducir las funcionalidades que soporta el navegador. Pero vamos a ir un poco más allá y vamos a utilizar una función que nos va a devolver directamente la información bien trabajada y lista para utilizar. Directamente podremos saber si el navegador soporta distintas funcionalidades o tecnologías, sin necesidad de deducir nada y sin necesidad de conocer todos los navegadores existentes.

La función en concreto es get_browser() y es muy sencilla de utilizar. Nos devuelve un objeto que contiene toda la información que podamos necesitar sobre las capacidades del navegador. Para empezar, vamos a mostrar su utilización:

Nota:Existen algunos casos en los que no podremos utilizar directamente get_browser() y en los que necesitaríamos editar el archivo de configuraciones php.ini o descargar una versión actualizada de la base de datos de navegadores y funcionalidades soportadas. Todo esto lo vamos a ver también en este artículo.

$navegador = get_browser();

Con esta línea hemos cargado en la variable $navegador las capacidades del navegador. Luego podremos preguntar a esta variable-objeto acerca de las distintas funcionalidades que queramos saber si soporta el browser del usuario. Utilizaremos un código como este:

if ($navegador->iframes){
   echo "<p>Permite el uso de IFRAMES</p>" . $navegador->iframes;
}else{
   echo "<p>NO permite IFRAMES</p>" . $navegador->iframes;
}

//Si lo deseamos, podríamos sacar una lista de las propiedades del objeto $navegador con un recorrido genérico a sus propiedades de objeto.

while (list($key, $val) = each($navegador)) {
    echo "<br>$key => $val\n";
}

Para el navegador Internet Explorer 7 todas las propiedades listadas junto con sus valores serían algo como esto:

browser_name_regex => ^mozilla/4\.0 (compatible; msie 7\.0; .*windows nt 5\.1.*).*$
browser_name_pattern => Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*
parent => IE 7.0
platform => WinXP
browser => IE
version => 7.0
majorver => 7
win32 => 1
frames => 1
iframes => 1
tables => 1
cookies => 1
backgroundsounds => 1
cdf => 1
vbscript => 1
javaapplets => 1
javascript => 1
activexcontrols => 1
css => 2
cssversion => 2
supportscss => 1
minorver => 0
alpha =>
beta =>
win16 =>
win64 =>
authenticodeupdate =>
stripper =>
isbanned =>
wap =>
ismobiledevice =>
issyndicationreader =>
crawler =>
aol =>
aolversion => 0
netclr =>
clrversion => 0

Como podemos ver, sería muy sencillo obtener cualquier dato sobre el navegador y las tecnologías que soporta. Por ejemplo, para saber si soporta javascript accederíamos a la propiedad $navegador->javascript. Si vale 1 es que soporta Javascript y si el valor es 0 es que no lo soporta.

Igual no estamos acostumbrados a trabajar con objetos en PHP. Entonces en ese caso podemos solicitarle a la función get_browser() que nos devuelva un array de valores asociativos, de esta manera:

$navegador = get_browser(null, true);

En ese caso accederíamos a los distintos valores del array $navegador de esta manera:

if ($navegador["cookies"]){
   echo "<p>Permite el uso de cookies " . $navegador["cookies"];
}else{
   echo "<p>NO permite usar cookies " . $navegador["cookies"];
}

Parámetros de get_browser()

Como hemos visto get_browser() permite la entrada de dos parámetros, ambos opcionales.

El primero es el user agent (la cadena esa rara que especifica el navegador y la versión). Si no indicamos user agent, PHP utiliza el del navegador que ha solicitado la página. Pero podríamos indicarle otro user agent a la función para que nos informase sobre las capacidades de otro navegador que no tiene por qué ser el del visitante.

El segundo parámetro que recibe es un boleano, que si es true quiere decir que deseamos que devuelva un array. Si no se envía un valor o el valor enviado en ese segundo parámetro es false, entonces indica que se desea recibir un objeto.

Archivo browscap.ini, con base de datos de capacidades de los navegadores

Para que esta función realice el trabajo correctamente tenemos que disponer de un archivo que contiene la base de datos de navegadores y sus capacidades. Ese archivo se llama generalmente browscap.ini y debe estar guardado en nuestro sistema e indicado correctamente en la configuración de PHP. Además, en nuestro sistema debemos disponer de una versión actualizada de browscap.ini.

Se puede obtener una versión actualizada de browscap.ini gratuitamente en el sitio Browser Capabilities Project

Este fichero lo tenemos que guardar en nuestro ordenador y debemos especificar la ruta donde se encuentra en el archivo php.ini. Tenemos que editar el php.ini en las líneas adecuadas. Algo como esto:

[browscap]
browscap = C:\php\php_browscap.ini

Si no hemos indicado la ruta para acceder al browscap.ini nos saldrá un error como este:

Warning: get_browser(): browscap ini directive not set. in c:\apache\www\tallerphp\get_browser.php on line 15

Utilizar get_browser() si no tenemos posibilidad de editar php.ini

Si estamos utilizando un alojamiento en un servidor donde no podemos editar el archivo de configuraciones php.ini, por ejemplo en un hosting compartido, también tenemos oportunidad de beneficiarnos de las capacidades de esta función.

Para ello tenemos que utilizar una función de PHP que nos provee un tercero, que dispone de un sistema útil para obtener las capacidades de un navegador. Esto está explicado en el sitio web PHP standalone get_browser() for Browscap.

Este sitio propone la utilización de una función nueva llamada get_browser_local() que sustituiría a la función nativa de PHP get_browser(). Este método lo único que requiere es que nosotros pongamos el archivo browscap.ini actualizado en un lugar donde se pueda leer desde páginas PHP.

Lo que tendríamos que hacer es descargar el módulo php-local-browscap de la página indicada anteriormente. Además, descargar el archivo browscap.ini del sitio Browser Capabilities Project . Entonces podríamos utilizar la función get_browser_local() de manera similar a lo que haríamos con la función get_browser().

require_once('php-local-browscap.php');
$navegador=get_browser_local();

Como se puede ver, primero tendremos que incluir el módulo con el código de la nueva función y luego llamarla como hacíamos anteriormente.

La función get_browser_local() tiene nuevos parámetros que se pueden utilizar, todos opcionalmente:

El primer parámetro es el user_agent (null por defecto). Este parámetro es igual que en la función get_browser(), para indicar otro user agent que no sea el del navegador del visitante.

El segundo parámetro es igual también que get_browser(). Sirve para indicar si queremos que nos devuelva un array o un objeto. Por defecto devuelve un objeto, pero si le pasamos el valor true devolvería un array.

El tercer parámetro es la ruta donde hemos colocado el archivo browscap.ini en nuestro sitio web. Por defecto se supone que el archivo está en el mismo directorio que el código PHP que se está ejecutando y que se llama browscap.ini. Es decir, el valor por defecto de este parámetro es './browscap.ini'.

El último parámetro es un boleano que indica si queremos que se guarde en memoria el archivo browscap.ini para acceder a él desde caché en sucesivas ocasiones. Por defecto el valor es false, por lo que no se guardaría en memoria.

Conclusión sobre get_browser()

Como se ha podido comprobar, este archivo es de bastante utilidad para conocer las funcionalidades o tecnologías que soporta un navegador. Hemos visto distintos casos de utilización y modos de usarlo en alojamientos normales, que no dejan editar el php.ini o donde no estamos seguros que el browscap.ini del sistema se encuentre actualizado.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

deerme.org

17/5/2007
Asi es, browscap.ini junto a la funcion get_browser nos permiten obtener varios datos del usuario.

Lo que si recomiendo utilizar la funcion con @get_browser(); ya que es posible que esten utilizando un navegador que no envie HTTP_USER_AGENT (cuando uno lee un fichero desde la red con php con un php.ini default , podemos ver que si utilizamos get_browser en ese fichero a pedir, vamos a generar un warning por el user agent del php por defecto).

Saludos

aukun

24/2/2014
problema get_browser(null.true)
Envie una nota a los de php a ver si me localizaban el problema pero, veo que tardan asi que para ir adelantando a ver si me pueden ayudar. Me baje la ultima version de browscap.ini de este febrero y con pack wamp que me instala automaticamente php cambio las lineas de php.ini de la zona [browscap] y la funcion get_browser funciona bien, para todos los navegadores. El problema es que wamp tiene un problema con el openssl y para mi servidor necesito esa proteccion. Asi que desinstalo wamp, e instalo apache i php (porque ese openssl.exe si que funciona), el caso es que cambio el php.ini con las rutas correctas es decir
browscap="f:/php/extras/browscap.ini" y cuando lee la linea donde se encuentra la funcion get_browser me da error
Warning: get_browser() [function.get-browser]: browscap ini directive not set in...
tipico error que te sale cuando la ruta no es la correcta, pero lo compruebo mil veces y si que esta bien esa ruta. Pensaba que era un problema de gramatica del tipo / en vez de o F en vez de f (pero windows no es sensitivecase en ese aspecto)... Debe haber algo mas que impida encontrar la funcion get_browser(), gracias de antemano por leerme, necesito ayuda.