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

Posted

技术标签:

【中文标题】如何获取运行 PHP 的操作系统?【英文标题】:How to get the OS on which PHP is running? 【发布时间】:2010-12-01 17:18:54 【问题描述】:

为了构建一个 unix/dos 特定的脚本,我需要知道我在哪种操作系统上。

我如何获得这些信息?phpinfo(); 告诉我更多但不是很清楚我是否在 unix 上运行。

【问题讨论】:

【参考方案1】:

PHP 有很多predefined constants,它们通常很有用。

这里,PHP_OS 就是您要找的那个。

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

var_dump(PHP_OS);

给:

string 'Linux' (length=5)

你有一些例子和比较 php_uname 功能可以让你在 manual page of 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 构建

【讨论】:

如果 PHP_OS 为您提供构建 PHP 的操作系统,它怎么可能“工作得非常好”?它迟早会破裂。 这是错误的答案!请参阅下面的 spikyjt 的答案! @Pacerier 目前的 php 文档说 "The operating system PHP was built for.",所以除非有人在 linux 上使用适用于 windows 的 php 版本,否则应该没问题。附带说明一下,对于 php7.2 及更高版本,shery089 的答案中显示的PHP_OS_FAMILY 对于大多数用户来说应该足够了【参考方案2】:

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

【讨论】:

php_uname('s') 在 Windows 7 上返回“Windows NT”,所以我不知道它有多可靠:) 我想有人可能会说 Win 7 基于 NT,但仍然...... Windows 7 绝对是 Windows NT(6.1 版)。 Vista 是 Windows NT 6,XP 是 NT 5.1,2000 是 NT 5。所以是的,它是可靠的!检查here 以供参考。在 cmd 提示符下键入 ver 以查看您的 Win OS 的版本号。 这对我来说似乎是正确的答案。接受的答案是完全错误的,并且没有回答 OP 的问题。 您能否详细说明“PHP 的操作系统是为什么而构建的”。方法? (PHP_OSphp.net/manual/en/reserved.constants.php 的描述)它就像编译 PHP 解释器的操作系统吗?它如何在另一个操作系统上使用? (这对于类似的 Unix 系统是可能的?对于同一操作系统的不同版本?) @YakovL 你提到的措辞不在我的回答中。我的回答是指“构建 PHP 的平台”和“部署它 [PHP] 的平台”。虽然这很少是不同的操作系统,但它通常是不同的机器,并且在技术上可以为其他平台交叉编译。需要明确的是,PHP_OS 是一个编译常量,指的是 PHP 本身的构建,与主机服务器无关。 php_uname() 是一个运行时函数,它会返回有关主机服务器的信息。【参考方案3】:

PHP 7.2.0 开始,我们有一个新的预定义常量来获取操作系统系列,即 PHP_OS_FAMILY。 它返回一个 字符串 “Windows”、“BSD”、“OSX”、“Solaris”、“Linux”或“未知”。

【讨论】:

【参考方案4】:

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
)

举行 og lykke [1] ;-)

[1] 丹麦语短语意味着好运。

【讨论】:

确切地说是“祝你好运和好运”【参考方案5】:

PHP_OS 以主机操作系统名称为前缀:http://us2.php.net/manual/en/reserved.constants.php

【讨论】:

【参考方案6】:

在 php 7.2.0 上,您可以使用 PHP_OS_FAMILY 常量:

http://php.net/manual/en/reserved.constants.php#constant.php-os-family

在其他 PHP 版本中你可以使用:

/**
* return DOS OR UNIX
*/
function familyOS() 
   return (stripos(PHP_OS, "WIN") === 0)? "DOS" : "UNIX";

【讨论】:

【参考方案7】:

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

    使用PHP_OS,它是一个常量,将指向'操作 系统名称”,您的 PHP 是在其中构建的。 使用 PHP 内置函数 php_uname() 会告诉你更多 关于平台(操作系统名称、主机名、版本 信息、版本名称、机器类型)您的脚本正在运行 就可以了。

【讨论】:

【参考方案8】:
#!/usr/bin/env php
<?php
$platform = DIRECTORY_SEPARATOR === '\\'
    ? 'Windows'
    : 'Unix/Linux';

我知道这不是很精细,但它可能足以在 Win 和 *nix 系统之间进行简单识别。 YMMV

【讨论】:

当然也可以检查其他特定于平台的常量,即。 PHP_EOL, ...【参考方案9】:

这是我正在使用的

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 常量。

【讨论】:

【参考方案10】:
$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);

【讨论】:

不鼓励仅使用代码回答,因为它们没有为未来的读者提供太多信息,请对您所写的内容提供一些解释 这会获取客户端操作系统(或对其进行最佳猜测),而不是服务器操作系统,因此无法回答问题。还应该注意的是,客户端用户代理很容易被欺骗,即使在您确实需要客户端操作系统的情况下,这也不可靠。这也仅在发出 http 请求时才相关,并且在命令行中是无用的。

以上是关于如何获取运行 PHP 的操作系统?的主要内容,如果未能解决你的问题,请参考以下文章

如何从存储过程中获取结果,过程运行良好但 php 返回 null

如何获取 PHP 脚本以从已运行的进程发送和接收数据?

php通过popen获取的一个命令的返回值如何分析出来

如何通过PHP中的IP地址获取时区[重复]

php 如何获取服务器的信息

如何从 PHP 获取 Oracle SQL 查询的 EXPLAIN PLAN?