Skrypt PHP - wykryj, czy działa pod Linuksem czy Windows?

143

Mam skrypt PHP, który można umieścić w systemie Windows lub Linux. W obu przypadkach muszę uruchomić różne polecenia.

Jak mogę wykryć, w jakim środowisku się znajduję? (najlepiej coś PHP zamiast sprytnych hacków systemowych)

Aktualizacja

Aby wyjaśnić, skrypt jest uruchamiany z wiersza poleceń.

siliconpi
źródło
Po wykonaniu odniesienia, wydaje się, że wszelkie różnice w wydajności pomiędzy \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'i \stripos(\PHP_OS, 'WIN')są poniżej 15%. Ponieważ wszystkie trzy rozwiązania zajmują tylko około 100 nanosekund, i tak byłaby to mikro-optymalizacja. Wybierz więc dowolne rozwiązanie. Na koniec możesz argumentować, że \strncasecmp(\PHP_OS, 'WIN', 3) === 0jest to najbardziej czytelne.
krakaj

Odpowiedzi:

228

Sprawdź wartość PHP_OSstałej Docs .

To daje różne wartości na Windows, jak WIN32, WINNTlub Windows.

Zobacz także: Możliwe wartości dla: PHP_OS i 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
źródło
Jaka byłaby wartość, gdyby był to system Windows? W dokumentach nie ma nic, co mogę zobaczyć.
Shabbyrobe
8
stripos(PHP_OS, 'WIN') === 0może być użyty zamiast tego, prawdopodobnie bardziej czytelny / prosty.
John Hunt
1
@ dw1 - nadal działałoby, ponieważ szukałby „win” na początku.
John Hunt
62

Możesz sprawdzić, czy separatorem katalogów jest /(dla unix / linux / mac) czy \w systemie Windows. Stała nazwa to DIRECTORY_SEPARATOR.

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

if (DIRECTORY_SEPARATOR === '\\') {
    // windows
}
Ibu
źródło
Niestety to nie działa z Windows 7 i Zend Server. W tym przypadku DIRECTORY_SEPARATOR to także '\'
Achim
4
@Achim Co masz na myśli? Zend Server to oprogramowanie serwera, a nie system operacyjny. Windows 7 powinien zwrócić \.
mpen
1
strpos(__FILE__,92)wykorzystuje to samo zachowanie; PATH_SEPARATOR>":"zwraca prawdę również dla Windows (PATH_SEPARATOR to ":" we wszystkich innych systemach operacyjnych).
Titus,
Zamieniłem to w funkcję: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!';
}

wydaje się nieco bardziej elegancka niż przyjęta odpowiedź. Wspomniane powyżej wykrycie za pomocą DIRECTORY_SEPARATOR jest jednak najszybsze.

Ondřej Bouda
źródło
Przepraszamy, ale to nie działa poprawnie, jeśli używasz serwera Mac, ponieważ na Macu otrzymujesz ciąg zawierający „DARWIN”, który również zawiera „WIN”, więc na serwerze Mac otrzymasz „To jest serwer z systemem Windows! ” co nie jest prawdą.
OMA
13
Cóż, to nie do końca prawda. Zauważ, że strncasecmpprzyjmuje pierwsze n znaków, a nie tylko n znaków. Gdybyś tego spróbował, przekonałbyś się, że ma strncasecmp('DARWIN', 'WIN', 3) == 0wartość false.
Ondřej Bouda
18

Zauważ, że PHP_OS donosi OS że PHP został zbudowany na , która niekoniecznie jest taka sama OS że jest uruchomiony na.

Jeśli korzystasz z PHP> = 5.3 i po prostu chcesz wiedzieć, czy korzystasz z systemu Windows, czy nie - Windows, przetestowanie, czy zdefiniowano jedną ze stałych specyficznych dla systemu Windows, może być dobrym rozwiązaniem, np .:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
ejn
źródło
4
1. Prawidłowe PHP nie jest miejsce, gdzie został zbudowany, ale za to, co zostało zbudowane na 2. Odnosi się do określonych okien związanych stałej w ten sam sposób ...
Stane
W każdym razie PHP zbudowane dla Windows nie może działać na unixie, prawda?
Stalinko
7

Zgodnie z predefiniowanymi stałymi : notatki przesłane przez użytkownika rozwiązania Volkera i rdcapasso można po prostu utworzyć klasę pomocniczą w następujący sposób:

<?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;
        }
    }

}

Stosowanie:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}
Patryk Uszyński
źródło
6

To powinno działać w PHP 4.3+:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}
Jonathon Hill
źródło
5

Począwszy od PHP 7.2.0 możesz wykryć działający system operacyjny za pomocą stałej PHP_OS_FAMILY:

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

Zobacz oficjalną dokumentację PHP, aby poznać możliwe wartości.

josemmo
źródło
4

Rdzeń predefiniowane stałe: http://us3.php.net/manual/en/reserved.constants.php, który ma PHP_OS (string)stałą.

Lub jeśli chcesz wykryć system operacyjny klienta:

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

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

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


Zgodnie z twoją edycją możesz odwołać się do tej opublikowanej nazwy serwera PHP z wiersza poleceń

Możesz użyć

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

Więc

php_uname("s")

„s”: nazwa systemu operacyjnego. na przykład. FreeBSD.

Zrobiłby dla ciebie sztuczkę, patrz tutaj http://php.net/manual/en/function.php-uname.php

Głosuj za
źródło
4

Aby wykryć, czy jest to system Windows, OS X czy 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
}

striposjest nieco wolniejszy niż substrw tym konkretnym przypadku, ale wystarczająco wydajny do tak małego zadania i bardziej elegancki.

artnikpro
źródło
Chociaż kod jest dość prosty, odpowiedź nie jest samodzielna: świetna odpowiedź nie zmusza do przeczytania pytania z wyszukiwarki, ponieważ jest samodzielna.
jpaugh
2

Możesz sprawdzić, czy stała istnieje w PHP> 5.3.0 ( ręcznie )

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

Wcześniej ta metoda była używana w Symfony. Teraz używają innej metody :

if ('\\' === DIRECTORY_SEPARATOR) {
    // is Windows
}
ghost404
źródło
0

Jeśli chcesz sprawdzić, czy działa pod Linuksem, po prostu sprawdź, czy (PHP_OS === 'Linux'). Nie ma potrzeby używania strtolower () i substr ().

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

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

To jest cała tablica $ _SERVER ... jak zauważył ArtWorkAD, używając klucza HTTP_USER_AGENT, możesz wyodrębnić system operacyjny bardziej jawnie.

Jordan Arseno
źródło