Script PHP - detectar se está sendo executado no Linux ou no Windows?


143

Eu tenho um script PHP que pode ser colocado em um sistema Windows ou Linux. Eu preciso executar comandos diferentes em ambos os casos.

Como posso detectar em que ambiente estou? (de preferência algo PHP em vez de hacks inteligentes do sistema)

Atualizar

Para esclarecer, o script está sendo executado na linha de comando.


Após a realização de padrões de referência, parece que as eventuais diferenças de desempenho entre \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'e \stripos(\PHP_OS, 'WIN')estão abaixo de 15%. Como as três soluções levam apenas cerca de 100 nanossegundos, isso seria uma micro otimização. Portanto, escolha a solução que desejar. Finalmente, você pode argumentar que \strncasecmp(\PHP_OS, 'WIN', 3) === 0é o mais legível.
quer

Respostas:


228

Verifique o valor dos documentosPHP_OS constantes .

Ele fornecerá vários valores no Windows WIN32, como , WINNTou Windows.

Veja também: Valores possíveis para: PHP_OS e 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!';
}

Qual seria o valor se fosse o Windows? Não há nada nos documentos que eu possa ver.
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0pode ser usado em vez disso, sem dúvida mais legível / simples.
John Hunt

1
@ dw1 - ainda funcionaria enquanto procurava por "vitória" no início.
John Hunt

62

Você pode verificar se o separador de diretório é /(para unix / linux / mac) ou \no Windows. O nome constante é DIRECTORY_SEPARATOR.

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

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

Infelizmente, isso não funciona no Windows 7 e no Zend Server. Nesse caso, DIRECTORY_SEPARATOR também é '\'
Achim

4
@Achim Como assim? O Zend Server é um software de servidor, não um sistema operacional. O Windows 7 deve retornar \.
MPEN

1
strpos(__FILE__,92)explora o mesmo comportamento; PATH_SEPARATOR>":"também retorna true para Windows (PATH_SEPARATOR é ":" em todos os outros sistemas operacionais).
Titus

Transformado isso em uma função:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
Mario Lurig 06/10

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 um pouco mais elegante que a resposta aceita. A detecção mencionada acima com DIRECTORY_SEPARATOR é a mais rápida.


Desculpe, mas isso não funciona corretamente se você estiver usando um servidor Mac, pois no Mac você obtém uma string que contém "DARWIN", que também contém "WIN", portanto, em um servidor Mac, você obtém "This is um servidor usando o Windows! " o que não é verdade.
OMA

13
Bem, isso não é bem verdade. Observe que strncasecmpleva os primeiros n caracteres, não apenas n caracteres. Se você tentou, você teria descoberto que strncasecmp('DARWIN', 'WIN', 3) == 0avalia false.
Ondřej Bouda

18

Note-se que PHP_OS relata o sistema operacional que o PHP foi construído em , que não é necessariamente o mesmo sistema operacional que está actualmente em execução.

Se você está no PHP> = 5.3 e precisa apenas saber se está executando no Windows ou não no Windows, testar se uma das constantes específicas do Windows está definida pode ser uma boa aposta, por exemplo:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. correta não é onde o PHP foi construído sobre, mas para o que foi construído para 2. Isto aplica-se às janelas definidas constante relacionados da mesma maneira ...
Stane

De qualquer forma, o PHP criado para Windows não pode ser executado no unix, pode?
Stalinko


7

De acordo com constantes predefinidas: notas fornecidas pelo usuário Volker e solução rdcapasso, você pode simplesmente criar uma classe 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

Isso deve funcionar no PHP 4.3 ou superior:

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

5

A partir do PHP 7.2.0, você pode detectar o sistema operacional em execução usando a constante PHP_OS_FAMILY:

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

Veja a documentação oficial do PHP para seus possíveis valores.


4

Constantes predefinidas principais: http://us3.php.net/manual/en/reserved.constants.php que possui a PHP_OS (string)constante.

Ou se você deseja detectar o sistema operacional do cliente:

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

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

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


De acordo com a sua edição, você pode consultar este nome de servidor PHP publicado na linha de comando

Você pode usar

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

assim

php_uname("s")

's': nome do sistema operacional. por exemplo. FreeBSD.

Faria o truque para você, veja aqui http://php.net/manual/en/function.php-uname.php


4

Para detectar se é Windows, OS X ou 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é um pouco mais lento do que substrnesse caso específico, mas é eficiente o suficiente para uma tarefa tão pequena e mais elegante.


Embora o código seja simples o suficiente, esta resposta não se sustenta por si só: uma ótima resposta não força a pessoa a ler a pergunta quando vem de um mecanismo de pesquisa, porque é independente.
jpaugh

2

Você pode verificar se existe uma constante no PHP> 5.3.0 ( manual )

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

Anteriormente, esse método era usado no Symfony. Agora eles usam um método diferente :

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

0

Se você quiser verificar se está executando no Linux, apenas teste se (PHP_OS === 'Linux'). Não há necessidade de usar strtolower () e substr ().


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.