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.

siliconpi
la source
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!';
}
Sander Marechal
la source
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
}
Ibu
la source
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.

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

La fonction php_uname peut être utilisée pour détecter cela.

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

Cela devrait fonctionner en PHP 4.3+:

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

Josemmo
la source
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

Vote favorable
la source
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.

artnikpro
la source
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
}
fantôme404
la source
0

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

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

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

C'est tout le tableau $ _SERVER ... comme ArtWorkAD l'a noté, en utilisant la clé HTTP_USER_AGENT, vous pouvez extraire le système d'exploitation plus explicitement.

Jordan Arseno
la source