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.

siliconpi
fuente
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!';
}
Sander Marechal
fuente
¿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
}
Ibu
fuente
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.

Ondřej Bouda
fuente
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');
ejn
fuente
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
8

La función php_uname se puede usar para detectar esto.

echo php_uname();
Anders Lindahl
fuente
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
}
Patryk Uszyński
fuente
6

Esto debería funcionar en PHP 4.3+:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}
Jonathon Hill
fuente
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.

josemmo
fuente
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

Voto a favor
fuente
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.

artnikpro
fuente
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
}
fantasma404
fuente
0

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

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

De http://www.php.net/manual/en/reserved.variables.server.php#102162 :

<?php
echo '<table border="1">';

foreach ($_SERVER as $k => $v){
    echo "<tr><td>" . $k ."</td><td>" . $v . "</td></tr>";
}

echo "</table>"
?>

Esta es toda la matriz $ _SERVER ... como ha notado ArtWorkAD, al usar la clave HTTP_USER_AGENT, puede extraer el sistema operativo más explícitamente.

Jordan Arseno
fuente