Script PHP - détecter s'il fonctionne sous Linux ou Windows?


143

J'ai un script PHP qui peut être placé sur un système Windows ou un système Linux. J'ai besoin d'exécuter différentes commandes dans les deux cas.

Comment puis-je détecter dans quel environnement je me trouve? (de préférence quelque chose de PHP plutôt que des hacks système intelligents)

Mettre à jour

Pour clarifier, le script s'exécute à partir de la ligne de commande.


Après avoir effectué des repères, il semble que les différences de performance entre \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'et \stripos(\PHP_OS, 'WIN')sont inférieurs à 15%. Étant donné que les trois solutions ne prennent qu'environ 100 nanosecondes, ce serait de toute façon une micro-optimisation. Alors choisissez la solution que vous aimez. Enfin, vous pouvez dire que \strncasecmp(\PHP_OS, 'WIN', 3) === 0c'est le plus lisible.
caw

Réponses:


228

Vérifiez la valeur de la PHP_OSconstante Docs .

Il vous donnera différentes valeurs sur Windows comme WIN32, WINNTou Windows.

Voir aussi: Valeurs possibles pour: PHP_OS et 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!';
}

Quelle valeur cela aurait-il si c'était Windows? Il n'y a rien dans la documentation que je puisse voir.
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0peut être utilisé à la place, sans doute plus lisible / simple.
John Hunt

1
@ dw1 - cela fonctionnerait toujours car il recherche "win" au début.
John Hunt

62

Vous pouvez vérifier si le séparateur de répertoire est /(pour unix / linux / mac) ou \sous windows. Le nom de la constante est DIRECTORY_SEPARATOR.

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

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

Malheureusement, cela ne fonctionne pas avec Windows 7 et Zend Server. Dans ce cas, DIRECTORY_SEPARATOR est également '\'
Achim

4
@Achim Que voulez-vous dire? Zend Server est un logiciel serveur, pas un système d'exploitation. Windows 7 devrait renvoyer \.
mpen

1
strpos(__FILE__,92)exploite le même comportement; PATH_SEPARATOR>":"renvoie true pour Windows également (PATH_SEPARATOR est ":" sur tous les autres systèmes d'exploitation).
Titus

Transformé ceci en une fonction: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!';
}

semble un peu plus élégant que la réponse acceptée. La détection mentionnée ci-dessus avec DIRECTORY_SEPARATOR est cependant la plus rapide.


Désolé, mais cela ne fonctionne pas correctement si vous utilisez un serveur Mac, car sous Mac, vous obtenez une chaîne contenant "DARWIN", qui contient également "WIN", donc sur un serveur Mac, vous obtiendrez "This is un serveur utilisant Windows! " ce qui n'est pas vrai.
OMA du

13
Eh bien, ce n'est pas tout à fait vrai. Notez que cela strncasecmpprend les n premiers caractères, pas n'importe quels n caractères. Si vous l'aviez essayé, vous auriez découvert que cela strncasecmp('DARWIN', 'WIN', 3) == 0équivaut à false.
Ondřej Bouda

18

Notez que PHP_OS rapporte le système d' exploitation que PHP a été construit sur , ce qui est pas nécessairement le même système d' exploitation qu'il est en cours d' exécution sur.

Si vous êtes sur PHP> = 5.3 et que vous avez juste besoin de savoir si vous utilisez Windows ou non-Windows, alors tester si l'une des constantes spécifiques à Windows est définie peut être un bon pari, par exemple:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. Le correct n'est pas l'endroit où PHP a été construit sur mais pour ce qu'il a été construit POUR 2. Cela s'applique à la constante liée aux fenêtres définies de la même manière ...
StanE

Quoi qu'il en soit, PHP construit pour Windows ne peut pas être exécuté sous unix, n'est-ce pas?
Stalinko


7

Selon les constantes prédéfinies: les solutions Volker et rdcapasso de Notes contribuées par l'utilisateur , vous pouvez simplement créer une classe d'assistance comme ceci:

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

}

Usage:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}

6

Cela devrait fonctionner en PHP 4.3+:

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

5

À partir de PHP 7.2.0, vous pouvez détecter le système d'exploitation en cours d'exécution en utilisant la constante PHP_OS_FAMILY:

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

Consultez la documentation PHP officielle pour ses valeurs possibles.


4

Constantes prédéfinies de base: http://us3.php.net/manual/en/reserved.constants.php qui a la PHP_OS (string)constante.

Ou si vous souhaitez détecter l'OS du client:

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

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

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


Selon votre modification, vous pouvez vous référer à ce nom de serveur PHP double à partir de la ligne de commande

Vous pouvez utiliser

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

Alors

php_uname("s")

's': nom du système d'exploitation. par exemple. FreeBSD.

Cela ferait l'affaire pour vous, voir ici http://php.net/manual/en/function.php-uname.php


4

Pour détecter s'il s'agit de 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
}

striposest un peu plus lent que substrdans ce cas particulier, mais il est assez efficace pour une si petite tâche, et plus élégant.


Bien que le code soit assez simple, cette réponse ne tient pas d'elle-même: une bonne réponse n'oblige pas à lire la question en venant d'un moteur de recherche, car elle est autonome.
jpaugh

2

Vous pouvez vérifier si une constante existe en PHP> 5.3.0 ( manuel )

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

Auparavant, cette méthode était utilisée dans Symfony. Maintenant, ils utilisent une méthode différente :

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

0

Si vous voulez vérifier si vous utilisez Linux, testez simplement si (PHP_OS === 'Linux'). Pas besoin d'utiliser strtolower () et substr ().


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.