web-dev-qa-db-fra.com

Comment obtenir le système d'exploitation sur lequel PHP est en cours d'exécution?

Pour construire un script spécifique à unix/dos, j'ai besoin de savoir quel type de système d'exploitation je suis. 

Comment puis-je obtenir cette information?
phpinfo(); me dit beaucoup plus et pas très clair si je suis sous Unix ou pas.

47
Martin Klepsch

PHP contient de nombreuses constantes prédéfinies qui sont souvent utiles.

Ici, PHP_OS est celui que vous recherchez.


Par exemple, sur mon ordinateur actuel, ce code:

var_dump(PHP_OS);

Donne:

string 'Linux' (length=5)


Vous avez des exemples et des comparaisons avec ce que la fonction php_uname peut vous obtenir sur la page de manuel de php_uname ; par exemple (citant):

<?php
echo php_uname();
echo PHP_OS;

/* Some possible outputs:
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686
Linux

FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001
FreeBSD

Windows NT XN1 5.1 build 2600
WINNT
*/

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

Cette page dit aussi:

Pour le nom de seulement le fonctionnement système, envisagez d’utiliser le PHP_OS constant, mais gardez à l’esprit ce la constante contiendra le fonctionnement le système PHP était construit sur.

90
Pascal MARTIN

N'oubliez pas que PHP_OS contient en fait la plate-forme sur laquelle PHP a été construit. Ce n'est peut-être pas la même plate-forme que celle sur laquelle elle est déployée. Par conséquent, php_uname('s') est plus fiable.

29
spikyjt

A partir de PHP 7.2.0 nous avons une nouvelle constante prédéfinie pour obtenir la famille du système d'exploitation, à savoir PHP_OS_FAMILY . Elle renvoie un string. Windows ',' BSD ',' OSX ',' Solaris ',' Linux 'ou' Inconnu '.

6
shery089

PHP_OS est défini avec le nom de l'hôte: http://us2.php.net/manual/en/reserved.constants.php

3
jmucchiello

Il y a 2 façons différentes de vérifier la plate-forme que votre PHP exécute sur celle-ci.

  1. Utiliser PHP_OS qui est un const et pointera sur le 'nom du système En cours d’exploitation' dans lequel votre PHP a été construit.
  2. En utilisant PHP dans la fonction php_uname() qui vous en dira plus sur la plate-forme (Nom du système d'exploitation, Nom de l'hôte, Informations sur la version , Nom de la version, Type de machine) sur laquelle votre script est exécuté .
2
M.J.Ahmadi

PHP Ne fournit aucune fonction pour obtenir le nom de la distribution, php_uname est similaire à la commande Linux uname, ne fournit aucune information sur la distribution elle-même.

php_uname ni PHP_OS ne donnent pas suffisamment d'informations. concernant la distribution mais le type de système d’exploitation (par exemple, Linux/Windows).

Je pense que le meilleur moyen de savoir quel est le système d’exploitation/la distribution en cours d’exécution est de lire /etc/os-release. Ce qui est bien, c’est que ce fichier a une autorisation de lecture pour tous les utilisateurs du système et que le problème est que cela ne fonctionnera peut-être pas sur un hébergement partagé.

Ici, j’ai écrit une fonction très simple PHP qui lit et convertit os-release en tableau:

    function getOSInformation()
    {
        if (false == function_exists("Shell_exec") || false == is_readable("/etc/os-release")) {
            return null;
        }

        $os         = Shell_exec('cat /etc/os-release');
        $listIds    = preg_match_all('/.*=/', $os, $matchListIds);
        $listIds    = $matchListIds[0];

        $listVal    = preg_match_all('/=.*/', $os, $matchListVal);
        $listVal    = $matchListVal[0];

        array_walk($listIds, function(&$v, $k){
            $v = strtolower(str_replace('=', '', $v));
        });

        array_walk($listVal, function(&$v, $k){
            $v = preg_replace('/=|"/', '', $v);
        });

        return array_combine($listIds, $listVal);
    }

Cette fonction imprime quelque chose comme ceci:

Array
(
    [name] => Ubuntu
    [version] => 16.04.2 LTS (Xenial Xerus)
    [id] => ubuntu
    [id_like] => debian
    [pretty_name] => Ubuntu 16.04.2 LTS
    [version_id] => 16.04
    [home_url] => http://www.ubuntu.com/
    [support_url] => http://help.ubuntu.com/
    [bug_report_url] => http://bugs.launchpad.net/ubuntu/
    [version_codename] => xenial
    [ubuntu_codename] => xenial
)

Held og lykke [1] ;-) 

[1] L'expression danoise signifie bonne chance.

2
Ahmad

Sur php 7.2.0, vous pouvez utiliser la constante PHP_OS_FAMILY:

Dans une autre version PHP, vous pouvez utiliser:

/**
* return DOS OR UNIX
*/
function familyOS() {
   return (stripos(PHP_OS, "WIN") === 0)? "DOS" : "UNIX";
}
1
fitorec
#!/usr/bin/env php
<?php
$platform = DIRECTORY_SEPARATOR === '\\'
    ? 'Windows'
    : 'Unix/Linux';

Je suis conscient que ce n'est pas très granulaire, mais cela peut suffire pour une simple reconnaissance entre les systèmes Win et * nix. YMMV

0
helvete