Script PHP: ¿detecta si se ejecuta bajo Linux o Windows?


143

Tengo un script PHP que se puede colocar en un sistema Windows o Linux. Necesito ejecutar diferentes comandos en cualquier caso.

¿Cómo puedo detectar en qué entorno estoy? (preferiblemente algo PHP en lugar de hacks inteligentes del sistema)

Actualizar

Para aclarar, el script se ejecuta desde la línea de comandos.


Después de realizar puntos de referencia, parece que las diferencias en el rendimiento entre \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'y \stripos(\PHP_OS, 'WIN')están por debajo del 15%. Dado que las tres soluciones solo toman aproximadamente 100 nanosegundos, de todos modos esto sería una microoptimización. Así que elige la solución que quieras. Finalmente, puede argumentar que \strncasecmp(\PHP_OS, 'WIN', 3) === 0es lo más legible.
caw

Respuestas:


228

Comprueba el valor de los documentosPHP_OS constantes .

Le dará varios valores en Windows como WIN32, WINNTo Windows.

Ver también: Valores posibles para: PHP_OS y php_unameDocs :

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

¿Qué valor tendría si fuera Windows? No hay nada en los documentos que pueda ver.
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0se puede usar en su lugar, posiblemente más legible / simple.
John Hunt

1
@ dw1: seguiría funcionando mientras busca "ganar" al principio.
John Hunt el

62

Puede verificar si el separador de directorio es /(para unix / linux / mac) o \en Windows. El nombre es constante DIRECTORY_SEPARATOR.

if (DIRECTORY_SEPARATOR === '/') {
    // unix, linux, mac
}

if (DIRECTORY_SEPARATOR === '\\') {
    // windows
}

Lamentablemente, esto no funciona con Windows 7 y Zend Server. En este caso, DIRECTORY_SEPARATOR también es '\'
Achim

44
@Achim ¿Qué quieres decir? Zend Server es un software de servidor, no un sistema operativo. Windows 7 debería devolver \.
mpen

1
strpos(__FILE__,92)explota el mismo comportamiento; PATH_SEPARATOR>":"devuelve verdadero también para Windows (PATH_SEPARATOR es ":" en todos los demás sistemas operativos).
Titus

Convirtió esto en una función:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
Mario Lurig

37
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

Parece un poco más elegante que la respuesta aceptada. Sin embargo, la detección antes mencionada con DIRECTORY_SEPARATOR es la más rápida.


Lo sentimos, pero esto no funciona bien si está utilizando un servidor Mac, ya que en Mac obtiene una cadena que contiene "DARWIN", que también contiene "WIN", por lo que en un servidor Mac obtendrá "Esto es un servidor usando Windows! " Lo cual no es cierto.
OMA

13
Bueno, esto no es del todo cierto. Observe que strncasecmptoma los primeros n caracteres, no solo n caracteres. Si lo intentara, habría descubierto que se strncasecmp('DARWIN', 'WIN', 3) == 0evalúa false.
Ondřej Bouda

18

Tenga en cuenta que PHP_OS informa el sistema operativo que PHP fue construido sobre , que no es necesariamente el mismo sistema operativo que se está ejecutando actualmente.

Si está en PHP> = 5.3 y solo necesita saber si está ejecutando en Windows o no Windows, entonces probar si una de las constantes específicas de Windows está definida puede ser una buena apuesta, por ejemplo:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

44
1. Correcto no es donde se construyó PHP, sino para lo que se construyó 2. Esto se aplica a las constantes relacionadas con ventanas definidas de la misma manera ...
StanE

De todos modos, PHP creado para Windows no se puede ejecutar en Unix, ¿verdad?
Stalinko


7

De acuerdo con las constantes predefinidas: las soluciones de Volker y rdcapasso de Contributed Notes contribuidas por el usuario , simplemente puede crear una clase auxiliar como esta:

<?php

class System {

    const OS_UNKNOWN = 1;
    const OS_WIN = 2;
    const OS_LINUX = 3;
    const OS_OSX = 4;

    /**
     * @return int
     */
    static public function getOS() {
        switch (true) {
            case stristr(PHP_OS, 'DAR'): return self::OS_OSX;
            case stristr(PHP_OS, 'WIN'): return self::OS_WIN;
            case stristr(PHP_OS, 'LINUX'): return self::OS_LINUX;
            default : return self::OS_UNKNOWN;
        }
    }

}

Uso:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}

6

Esto debería funcionar en PHP 4.3+:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}

5

A partir de PHP 7.2.0, puede detectar el sistema operativo en ejecución utilizando la constante PHP_OS_FAMILY:

if (PHP_OS_FAMILY === "Windows") {
  echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
  echo "Running on Linux";
}

Consulte la documentación oficial de PHP para conocer sus posibles valores.


4

Constantes predefinidas principales: http://us3.php.net/manual/en/reserved.constants.php que tiene la PHP_OS (string)constante.

O si desea detectar el sistema operativo del cliente:

<?php
    echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

    $browser = get_browser(null, true);
    print_r($browser);
?>

De http://us3.php.net/manual/en/function.get-browser.php


De acuerdo con su edición, puede consultar este nombre duplicado del servidor PHP desde la línea de comandos

Puedes usar

string php_uname ([ string $mode = "a" ] )

Entonces

php_uname("s")

's': nombre del sistema operativo. p.ej. FreeBSD.

Haría el truco por ti, mira aquí http://php.net/manual/en/function.php-uname.php


4

Para detectar si es Windows, OS X o Linux:

if (stripos(PHP_OS, 'win') === 0) {
    // code for windows
} elseif (stripos(PHP_OS, 'darwin') === 0) {
    // code for OS X
} elseif (stripos(PHP_OS, 'linux') === 0) {
    // code for Linux
}

striposes un poco más lento que substren este caso en particular, pero es lo suficientemente eficiente para una tarea tan pequeña y más elegante.


Aunque el código es lo suficientemente simple, esta respuesta no se sostiene por sí sola: una gran respuesta no obliga a uno a leer la pregunta cuando proviene de un motor de búsqueda, ya que es autónoma.
jpaugh

2

Puede verificar si existe una constante en PHP> 5.3.0 ( manual )

if (defined('PHP_WINDOWS_VERSION_BUILD')) {
    // is Windows
}

Anteriormente, este método se usaba en Symfony. Ahora usan un método diferente :

if ('\\' === DIRECTORY_SEPARATOR) {
    // is Windows
}

0

Si desea verificar si se ejecuta bajo Linux, solo pruebe si (PHP_OS === 'Linux'). No es necesario usar strtolower () y substr ().


-1
function isWin(){
 if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') {
    return true;
 } else {
    return false;
 }
}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.