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.

siliconpi
fonte
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!';
}
Sander Marechal
fonte
Qual seria o valor se fosse o Windows? Não há nada nos documentos que eu possa ver.
Shabbyrobe
6
Shabbyrobe: consulte stackoverflow.com/questions/738823/possible-values-for-php-os
Sander Marechal
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
}
Ibu
fonte
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.

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

A função php_uname pode ser usada para detectar isso.

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

Isso deve funcionar no PHP 4.3 ou superior:

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

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

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

artnikpro
fonte
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
}
ghost404
fonte
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 ().

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

Em 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>"
?>

Essa é toda a matriz $ _SERVER ... como o ArtWorkAD observou, usando a chave HTTP_USER_AGENT, você pode extrair o SO mais explicitamente.

Jordan Arseno
fonte