156 votes

<script>Script PHP - détecter s'il fonctionne sous Linux ou Windows?</script>

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 des commandes différentes dans chaque cas.

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

Mise à jour

Pour clarifier, le script s'exécute en ligne de commande.

0 votes

Après avoir effectué des benchmarks, 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érieures à 15%. Étant donné que les trois solutions ne prennent que environ 100 nanosecondes, cela relèverait d'une micro-optimisation de toute façon. Donc choisissez la solution que vous préférez. Enfin, vous pouvez argumenter que \strncasecmp(\PHP_OS, 'WIN', 3) === 0 est la plus lisible.

253voto

Sander Marechal Points 13699

Vérifiez la valeur de la PHP_OS constanteDocs.

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

Voir aussi: Valeurs Possibles Pour: PHP_OS et php_unameDocs:

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    echo 'Ceci est un serveur utilisant Windows!';
} else {
    echo 'Ceci est un serveur ne utilisant pas Windows!';
}

0 votes

Quelle valeur serait-ce si c'était Windows? Il n'y a rien dans la documentation que je puisse voir.

6 votes

15 votes

stripos(PHP_OS, 'WIN') === 0 peut être utilisé à la place, peut-être plus lisible / simple.

70voto

Ibu Points 17457

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

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

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

0 votes

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

4 votes

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

2 votes

strpos(__FILE__,92) exploite le même comportement; PATH_SEPARATOR>":" renvoie également vrai pour Windows (PATH_SEPARATOR est ":" sur tous les autres OS).

39voto

Ondřej Bouda Points 357
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
    echo 'Ceci est un serveur utilisant Windows!';
} else {
    echo 'Ceci est un serveur ne utilisant pas Windows!';
}

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

0 votes

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

14 votes

Eh bien, ce n'est pas tout à fait vrai. Remarquez que strncasecmp prend les premiers caractères n, pas seulement n'importe quels caractères n. Si vous l'aviez essayé, vous auriez découvert que strncasecmp('DARWIN', 'WIN', 3) == 0 évalue à false.

17voto

ejn Points 91

Notez que PHP_OS rapporte le système d'exploitation sur lequel PHP a été construit, ce qui n'est pas nécessairement le même système d'exploitation sur lequel il s'exécute actuellement.

Si vous utilisez PHP >= 5.3 et avez juste besoin de savoir si vous utilisez Windows ou un autre système d'exploitation, tester si l'une des constantes spécifiques à Windows est définie peut être une bonne idée, par exemple :

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

5 votes

1. La correction ne concerne pas là où PHP a été construit, mais pour quoi il a été construit. 2. Cela s'applique de la même manière à la constante liée à Windows définie...

1 votes

Quoi qu'il en soit, PHP conçu pour Windows ne peut pas être exécuté sur Unix, n'est-ce pas?

8voto

Anders Lindahl Points 17380

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

echo php_uname();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X