如何获取 PHP 运行的操作系统?

75

为了编写与Unix / DOS特定脚本,我需要知道我所在的操作系统类型。

如何获取此信息?
phpinfo()会告诉我更多信息,但不清楚我是否正在运行Unix。

10个回答

128

PHP有许多预定义常量,通常很有用。

在这里,PHP_OS是你要找的那个。


例如,在我的当前机器上,这段代码:

var_dump(PHP_OS);

提供:

string 'Linux' (length=5)


你可以在 php_uname 函数的手册页面 中找到一些示例和与其相比较的内容;例如php_uname函数能够获取什么(摘录):

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

那个页面还说:

如果只需要操作系统的名称,可以考虑使用PHP_OS常量,但请记住,这个常量包含PHP所构建的操作系统。


6
如果PHP_OS给出了PHP构建所在的操作系统,那么它怎么可能“运作得相当好呢?”这种绑定关系迟早会出问题。 - Pacerier
这不是正确的答案!请查看下面spikyjt的答案! - undo
@Pacerier 目前的 PHP 文档中写道 "PHP 所构建的操作系统。", 因此除非有人在 Linux 上使用了专为 Windows 设计的 PHP 版本,否则它应该可以正常运行。另外,对于 PHP7.2 及以上版本,如 shery089 的回答所示,PHP_OS_FAMILY 应该足够满足大多数用户的需求。 - Arun A S

47

请记住,PHP_OS实际上包含了构建PHP的平台。这可能与部署它的平台不同。因此,php_uname('s')更可靠。


在Windows 7上运行php_uname('s')会返回"Windows NT",所以我不知道它有多可靠 :) 我猜可以说Win 7是基于NT的,但仍然... - laurent
10
Windows 7绝对是Windows NT(版本6.1)的一种。Vista是Windows NT 6,XP是NT 5.1,2000是NT 5。所以它是可靠的!参考这里。在命令提示符下键入ver以查看您的Win OS的版本号。 - spikyjt
2
这对我来说似乎是正确的答案。被接受的答案完全错误,没有回答OP的问题。 - Evan de la Cruz
请问 "PHP操作系统是为什么而建立的" 是什么意思?(参见http://php.net/manual/en/reserved.constants.php中对`PHP_OS`的描述)它是否像一个内置了PHP解释器的操作系统?它如何在另一个操作系统上使用?(对于类似的Unix系统,或者同一操作系统的不同版本,这是可能的吗?) - YakovL
1
@YakovL,你提到的措辞并不在我的回答中。我的回答是指“PHP构建的平台”和“它[PHP]部署的平台”。虽然这很少是不同的操作系统,但通常是不同的机器,并且在技术上可以交叉编译到其他平台。需要明确的是,PHP_OS是一个编译时常量,指的是PHP本身的构建,并与主机服务器无关。php_uname()是一个运行时函数,确实返回有关主机服务器的信息。 - spikyjt
我明白,我只是觉得你可能知道一些具体的例子,可以说明这种差异发生的情况。 - YakovL

23

PHP 7.2.0开始,我们有一个新的预定义常量可以获取操作系统家族,即PHP_OS_FAMILY。 它返回一个字符串 可能是'Windows','BSD','OSX','Solaris','Linux'或'Unknown'。


这并不告诉您所在的操作系统。它返回PHP构建的操作系统。我认为它们有99%的可能是相同的,但是脚本可以在另一个操作系统上使用PHP版本。 - dewd
小心,只有一个预发布版本:7.2.0alpha1,它会将 Mac 返回为“OSX”。这在 internals 中已经讨论过,并在 7.2.0alpha2 中进行了更改。在所有稳定版本的 PHP >= 7.2.0 中,它始终将 Mac 返回为“Darwin”。 - Ultimater

9

PHP没有提供任何函数来获取发行版名称,php_uname类似于Linux命令uname,但不提供有关发行版本身的任何信息。

php_unamePHP_OS都不能提供关于发行版的足够信息,只能提供操作系统类型(例如Linux / Windows)。

我认为了解正在运行的操作系统/发行版的最佳方法是读取/etc/os-release文件,好处是此文件所有系统用户都有读取权限,缺点是它可能无法在共享主机上工作。

这里我编写了一个非常简单的PHP函数,将os-release读取并转换为数组:

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

这个函数会打印类似这样的内容:
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
)

祝你好运[1];-)
[1] 这是丹麦语的短语,意思是祝好运。

1
祝你好运和好命。 - JoSSte

4

3

2

有两种不同的方法可以检查PHP运行的平台。

  1. 使用PHP_OS,它是一个常量,将指向PHP构建所在的“操作系统名称”。
  2. 使用PHP内置函数php_uname(),它将告诉您更多关于脚本正在运行的平台(操作系统名称、主机名、版本信息、发布名称、机器类型)的信息。

1
#!/usr/bin/env php
<?php
$platform = DIRECTORY_SEPARATOR === '\\'
    ? 'Windows'
    : 'Unix/Linux';

我知道这并不是非常细致,但对于区分Windows和*nix系统可能已经足够了。你的情况可能有所不同。

当然,也可以检查其他特定于平台的常量,例如 PHP_EOL,... - helvete

1
这是我正在使用的内容。
switch (strtolower(php_uname('s'))) {
    case "linux": echo "Server is running on linux OS"
        break;
    case "windows nt": echo "Server is running on Windows OS"
        break;
    default:
        echo "Unknown";
        break;
}

我们也可以使用PHP_OS,但这并不准确,因为文档说PHP构建的操作系统。所以php_uname('s')是一个好方法。
然而,PhpStrom 2020.2 IDE建议使用[EA]应该使用PHP_OS常量。

-4
$user_agent     =   $_SERVER['HTTP_USER_AGENT'];
function getOS() { 

    global $user_agent;

    $os_platform    =   "Unknown OS Platform";

    $os_array       =   array(
                            '/windows nt 6.2/i'     =>  'Windows 8',
                            '/windows nt 6.1/i'     =>  'Windows 7',
                            '/windows nt 6.0/i'     =>  'Windows Vista',
                            '/windows nt 5.2/i'     =>  'Windows Server 2003/XP x64',
                            '/windows nt 5.1/i'     =>  'Windows XP',
                            '/windows xp/i'         =>  'Windows XP',
                            '/windows nt 5.0/i'     =>  'Windows 2000',
                            '/windows me/i'         =>  'Windows ME',
                            '/win98/i'              =>  'Windows 98',
                            '/win95/i'              =>  'Windows 95',
                            '/win16/i'              =>  'Windows 3.11',
                            '/macintosh|mac os x/i' =>  'Mac OS X',
                            '/mac_powerpc/i'        =>  'Mac OS 9',
                            '/linux/i'              =>  'Linux',
                            '/ubuntu/i'             =>  'Ubuntu',
                            '/iphone/i'             =>  'iPhone',
                            '/ipod/i'               =>  'iPod',
                            '/ipad/i'               =>  'iPad',
                            '/android/i'            =>  'Android',
                            '/blackberry/i'         =>  'BlackBerry',
                            '/webos/i'              =>  'Mobile'
                        );

    foreach ($os_array as $regex => $value) { 

        if (preg_match($regex, $user_agent)) {
            $os_platform    =   $value;
        }

    }   

    return $os_platform;

}

$user_os  =   getOS();


$device_details =   "<strong>Operating System: </strong>".$user_os."";

print_r($device_details);

1
仅提供代码答案并不鼓励,因为它们对于未来的读者提供的信息不多,请在您编写的代码上提供一些解释。 - WhatsThePoint
1
这会获取客户端操作系统(或者尽可能猜测它),而不是服务器操作系统,因此并不能回答问题。还应该注意到,客户端用户代理可以很容易地被欺骗,即使在你确实需要客户端操作系统的情况下也不可靠。这仅在进行http请求时才相关,并且从命令行无法使用。 - mopsyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接