Tengo un script PHP que pueden ser instalados en un sistema windows o un sistema linux. Necesito ejecutar diferentes comandos en cualquiera de los casos.

¿Cómo puedo detectar el ambiente que me encuentro? (de preferencia algo de PHP en lugar de sistema inteligente hacks)

Actualización

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

  • hace @Todo el trabajo?
  • Arsenault – por favor, consulte editar!
  • He actualizado mi respuesta
InformationsquelleAutor siliconpi | 2011-05-04

13 Comentarios

  1. 211

    Comprobar el valor de la PHP_OS constanteDocs.

    Va a dar varios valores en Windows como WIN32, WINNT o Windows.

    Ver así: 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 sería si es Windows? No hay nada en la documentación que puedo ver.
    • Shabbyrobe: Consulte stackoverflow.com/questions/738823/possible-values-for-php-os
    • stripos(PHP_OS, 'WIN') === 0 puede ser utilizado en lugar de eso, podría decirse que más legible / simple.
    • aún así el trabajo de la búsqueda para «ganar» en el principio.
  2. 55

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

    if (DIRECTORY_SEPARATOR == '/') {
        //unix, linux, mac
    }
    
    if (DIRECTORY_SEPARATOR == '\') {
        //windows
    }
    • El de abajo sería ‘\\’
    • Lamentablemente esto no funciona con Windows 7 y Zend Server. En este caso DIRECTORY_SEPARATOR también es ‘\’
    • ¿A qué te refieres? Zend Server es el software de servidor, no un sistema operativo. Windows 7 debe volver \.
    • strpos(__FILE__,92) explota el mismo comportamiento; PATH_SEPARATOR>":" devuelve true para Windows (PATH_SEPARATOR es «:» en todos los otros sistemas operativos).
    • Se convirtió en una función: function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
  3. 36
    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 el aceptado respuesta. El mencionado detección con DIRECTORY_SEPARATOR es el más rápido, sin embargo.

    • Lo siento, pero este no funciona bien si usted está usando un Mac del servidor, ya que en Mac, usted obtiene una cadena que contiene «DARWIN», que también contiene «GANAR», por lo que en un servidor Mac obtendrá «Este es un servidor con Windows!», lo cual no es cierto.
    • Bueno, esto no es completamente cierto. Observe que strncasecmp toma el primer n los personajes, no sólo de cualquier tipo de n caracteres. Si lo ha intentado, habría descubierto que strncasecmp('DARWIN', 'WIN', 3) == 0 evalúa a false.
    • Tienes razón, mi mala…
    • Muy gracioso. Buena respuesta.
  4. 16

    Nota que PHP_OS informes el sistema operativo que PHP fue construido en, que no es necesariamente el mismo sistema operativo que se esté ejecutando actualmente.

    Si usted está en PHP >= 5.3 y sólo falta saber si se está ejecutando en Windows o no-Windows, a continuación, comprobar si uno de los Específicos de Windows constantes es definido puede ser una buena apuesta, por ejemplo:

    $windows = defined('PHP_WINDOWS_VERSION_MAJOR');
    • 1. Corregir no es que PHP fue construido EN el, pero para lo que fue construido PARA la 2. Esto se aplica a windows definida relacionadas con la constante de la misma manera…
    • De todos modos PHP construido para Windows no puede ejecutarse en unix, se puede?
  5. 6

    Esto debería funcionar en PHP 4.3+:

    if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
    {
        //Windows
    }
    else
    {
        //Linux/UNIX/OS X
    }
    • Este es el mejor
    • simplemente wow, dll es algún tipo de marca ya 🙂
  6. 5

    Según Constantes Predefinidas: Usuario Contribuido Notas Volker y rdcapasso solución, usted puede simplemente crear ayudante de clase 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
    }
  7. 4

    Núcleo de Constantes Predefinidas: http://us3.php.net/manual/en/reserved.constants.php que tiene la PHP_OS (string) constante.

    O si se quiere 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 a la edición, puede hacer referencia a esta dublicate PHP Nombre del Servidor desde la Línea de Comandos

    Puede utilizar

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

    Así

    php_uname("s")

    ‘s’: nombre del sistema Operativo. por ejemplo.
    FreeBSD.

    Iba a hacer el truco para ti, ven aquí http://php.net/manual/en/function.php-uname.php

  8. 3

    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
    }

    stripos es un poco más lento que substr en este caso en particular, sin embargo, es lo suficientemente eficiente para una tarea, y la más elegante.

    • Aunque el código es bastante simple, esta respuesta no estar en su propio: Una gran respuesta no obliga a uno a leer la pregunta cuando viene de un motor de búsqueda, porque es auto-contenida.
    • fijo. gracias
  9. 1

    Usted puede comprobar si existe una constante en PHP >5.3.0 (manual)

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

    Anteriormente, este método fue utilizado en Symfony. Ahora que uso un método diferente:

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

    Si quieres comprobar si se ejecuta en Linux, solo prueba si (PHP_OS === 'Linux'). No hay necesidad de utilizar strtolower() y substr().

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

Dejar respuesta

Please enter your comment!
Please enter your name here