28 de agosto de 2017

Conocer el sistema operativo desde PHP

Determinar el sistema operativo desde PHP es una tarea recurrente cuando programamos un aplicación web desde PHP. Esto se puede presentar en dos modalidades, determinar el sistema operativo de un visitante a nuestra página, o el sistema operativo donde se esta ejecutando la aplicación servidora.
PHP nos entrega facilidades para efectuar la acción de detectar el sistema operativo de forma muy rapida.
En este artículo escribiremos el código necesario para conocer el sistema operativo desde la propia ejecución del script PHP.

Determinar el sistema operativo del servidor

Conocer el sistema operativo anfitrión donde se ejecuta nuestra aplicación web PHP, es sencillo:
<?php 
// usando la constante predefinida para 
// obtener el nombre del sistema operativo, 
// con el cual el intérprete PHP fue compilado, 
// no necesariamente será la misma 
// plataforma donde PHP se encuentra ejecutándose:
//
echo PHP_OS;
//
// para obtener una información más confiable y detallada:
//
echo php_uname();
Vemos que tenemos dos alternativas, usando la constante predefinida de PHP llamada PHP_OS o usando la función php_uname().

Detectar el sistema operativo del cliente

Conocer el sistema operativo que usa un visitante o usuario a nuestra aplicación web, se puede efectuar desde PHP usando un código un algo más extenso al anterior:
<?php
// obteniendo el 'user_agent':
//
if ( isset( $_SERVER ) ) {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
} else {
    global $HTTP_SERVER_VARS;
    if ( isset( $HTTP_SERVER_VARS ) ) {
        $user_agent = $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
    } else {
        global $HTTP_USER_AGENT;
        $user_agent = $HTTP_USER_AGENT;
    }
}
//
//
function getOS() { 
    global $user_agent;
    $os_array =  array(
                    '/windows nt 10/i'      =>  'Windows 10',
                    '/windows nt 6.3/i'     =>  'Windows 8.1',
                    '/windows nt 6.2/i'     =>  'Windows 8',
                    '/windows nt 6.1/i'     =>  'Windows 7',
                    '/windows nt 6.0/i'     =>  'Windows Vista',
                    '/windows nt 5.2/i'     =>  'Windows Server 2003/XP x64',
                    '/windows nt 5.1/i'     =>  'Windows XP',
                    '/windows xp/i'         =>  'Windows XP',
                    '/windows nt 5.0/i'     =>  'Windows 2000',
                    '/windows me/i'         =>  'Windows ME',
                    '/win98/i'              =>  'Windows 98',
                    '/win95/i'              =>  'Windows 95',
                    '/win16/i'              =>  'Windows 3.11',
                    '/macintosh|mac os x/i' =>  'Mac OS X',
                    '/mac_powerpc/i'        =>  'Mac OS 9',
                    '/linux/i'              =>  'Linux',
                    '/ubuntu/i'             =>  'Ubuntu',
                    '/iphone/i'             =>  'iPhone',
                    '/ipod/i'               =>  'iPod',
                    '/ipad/i'               =>  'iPad',
                    '/android/i'            =>  'Android',
                    '/blackberry/i'         =>  'BlackBerry',
                    '/webos/i'              =>  'Mobile'
                  );
    //
    $os_platform = "Unknown OS Platform";
    foreach ($os_array as $regex => $value) { 
        if (preg_match($regex, $user_agent)) {
            $os_platform = $value;
        }
    }
    return $os_platform;
}
//
//
function getBrowser() {
    global $user_agent;
    $browser_array = array(
                        '/msie/i'       =>  'Internet Explorer',
                        '/firefox/i'    =>  'Firefox',
                        '/safari/i'     =>  'Safari',
                        '/chrome/i'     =>  'Chrome',
                        '/edge/i'       =>  'Edge',
                        '/opera/i'      =>  'Opera',
                        '/netscape/i'   =>  'Netscape',
                        '/maxthon/i'    =>  'Maxthon',
                        '/konqueror/i'  =>  'Konqueror',
                        '/mobile/i'     =>  'Handheld Browser'
                      );
    $browser = "Unknown Browser";
    foreach ($browser_array as $regex => $value) { 
        if (preg_match($regex, $user_agent)) {
            $browser = $value;
        }
    }
    return $browser;
}
//
// Iniciando la ejecución de las funciones anteriores:
// 
$user_os        =   getOS();
$user_browser   =   getBrowser();
$device_details =   "<strong>Browser: </strong>" . $user_browser . 
                    "<br /><strong>Operating System: </strong>" . $user_os;
print_r($device_details);
echo("<br /><br /><br />" . $_SERVER['HTTP_USER_AGENT']);
?>
La verdad es que obtenemos más que sólo el sistema operativo del visitante a nuesta web, sino que conseguimos:
  • Navegador web que usa el visitante.
  • Detalles más específicos del navegador.
  • El Motor interno que emplea el navegador.
  • Y el Sistema Operativo del dispositivo que usa el visitante.
Todo lo anterior, basicamente usando algo más a las variables de servidor disponibles en PHP.

Conclusión

Sin duda, conocer las características de hardware y software de nuestro visitante, nos permite avanzar en el grado de personalización que podemos agregar a nuestra aplicación web. Y disponer del código que realice esta tarea es un útil recurso en nuestro arsenal de snippets como programador, evitando tener que programar la funcionalidad una y otro vez (DRY).

Otras referencias