Script PHP: rileva se è in esecuzione su Linux o Windows?


143

Ho uno script PHP che può essere posizionato su un sistema Windows o Linux. Devo eseguire comandi diversi in entrambi i casi.

Come posso rilevare in quale ambiente mi trovo? (preferibilmente qualcosa di PHP piuttosto che hack di sistema intelligenti)

Aggiornare

Per chiarire, lo script è in esecuzione dalla riga di comando.


Dopo aver eseguito benchmark, sembra che eventuali differenze di prestazioni tra \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'e \stripos(\PHP_OS, 'WIN')sono al di sotto del 15%. Dato che tutte e tre le soluzioni richiedono solo circa 100 nanosecondi, si tratterebbe comunque di una micro-ottimizzazione. Quindi scegli la soluzione che preferisci. Infine, potresti obiettare che \strncasecmp(\PHP_OS, 'WIN', 3) === 0è il più leggibile.
Caw

Risposte:


228

Controlla il valore della PHP_OScostante Documenti .

Ti darà vari valori su Windows come WIN32, WINNTo Windows.

Vedi anche: Valori possibili per: PHP_OS e php_unameDocumenti :

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

Quale valore sarebbe se fosse Windows? Non c'è nulla nei documenti che posso vedere.
Shabbyrobe,


8
stripos(PHP_OS, 'WIN') === 0può invece essere usato, probabilmente più leggibile / semplice.
John Hunt,

1
@ dw1 - funzionerebbe comunque mentre cerca "win" all'inizio.
John Hunt,

62

Puoi verificare se il separatore di directory è /(per unix / linux / mac) o \su Windows. Il nome costante è DIRECTORY_SEPARATOR.

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

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

Purtroppo questo non funziona con Windows 7 e Zend Server. In questo caso DIRECTORY_SEPARATOR è anche '\'
Achim

4
@Achim Che vuoi dire? Zend Server è un software server, non un sistema operativo. Windows 7 dovrebbe restituire \.
Aprire il

1
strpos(__FILE__,92)sfrutta lo stesso comportamento; PATH_SEPARATOR>":"ritorna vero anche per Windows (PATH_SEPARATOR è ":" su tutti gli altri sistemi operativi).
Tito

Trasformato questo in una funzione: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!';
}

sembra un po 'più elegante della risposta accettata. Il rilevamento di cui sopra con DIRECTORY_SEPARATOR è il più veloce, però.


Siamo spiacenti, ma questo non funziona correttamente se stai utilizzando un server Mac, poiché in Mac ottieni una stringa che contiene "DARWIN", che contiene anche "WIN", quindi in un server Mac otterrai "Questo è un server che utilizza Windows! " che non è vero.
OMA,

13
Bene, questo non è del tutto vero. Si noti che strncasecmpaccetta i primi n caratteri, non solo i n caratteri. Se lo avessi provato, avresti scoperto che strncasecmp('DARWIN', 'WIN', 3) == 0valuta false.
Ondřej Bouda,

18

Nota che PHP_OS riporta il sistema operativo su cui è stato creato PHP , che non è necessariamente lo stesso sistema operativo su cui è attualmente in esecuzione.

Se sei su PHP> = 5.3 e hai solo bisogno di sapere se stai eseguendo Windows o no, testare se è definita una delle costanti specifiche di Windows può essere una buona scommessa, ad esempio:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. Corretto non è dove il PHP è stato attivato ma per quello che è stato costruito PER 2. Questo vale per la costante relativa a Windows definita allo stesso modo ...
StanE

Ad ogni modo PHP creato per Windows non può essere eseguito su unix, vero?
Stalinko,


7

Secondo Costanti predefinite: note fornite dall'utente Volker e la soluzione rdcapasso, puoi semplicemente creare una classe di supporto come questa:

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

Questo dovrebbe funzionare in PHP 4.3+:

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

5

A partire da PHP 7.2.0 è possibile rilevare il sistema operativo in esecuzione utilizzando la costante PHP_OS_FAMILY:

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

Consulta la documentazione ufficiale di PHP per i suoi possibili valori.


4

Costanti predefinite di base: http://us3.php.net/manual/en/reserved.constants.php che ha la PHP_OS (string)costante.

O se si desidera rilevare il sistema operativo del client:

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

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

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


Secondo la tua modifica puoi fare riferimento a questo nome di server PHP pubblico dalla riga di comando

Puoi usare

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

Così

php_uname("s")

's': nome del sistema operativo. per esempio. FreeBSD.

Farebbe il trucco per te, vedi qui http://php.net/manual/en/function.php-uname.php


4

Per rilevare se si tratta di 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è un po 'più lento rispetto substra questo caso particolare, tuttavia è abbastanza efficiente per un compito così piccolo e più elegante.


Sebbene il codice sia abbastanza semplice, questa risposta non è autonoma: una risposta eccellente non obbliga a leggere la domanda quando proviene da un motore di ricerca, perché è autonoma.
jpaugh,

2

Puoi verificare se esiste una costante in PHP> 5.3.0 ( manuale )

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

In precedenza, questo metodo era usato in Symfony. Ora usano un metodo diverso :

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

0

Se vuoi controllare se è in esecuzione su Linux, prova solo se (PHP_OS === 'Linux'). Non è necessario utilizzare 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;
 }
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.