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

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

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

【问题讨论】:

    标签: php operating-system


    【解决方案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 常量:

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

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

        【讨论】:

          【解决方案7】:

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

          1. 使用PHP_OS,它是一个常量,将指向'操作 系统名称”,您的 PHP 是在其中构建的。
          2. 使用 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 请求时才相关,并且在命令行中是无用的。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-05
              • 1970-01-01
              • 2013-11-11
              • 1970-01-01
              • 2019-05-11
              • 2011-06-28
              • 2012-11-19
              相关资源
              最近更新 更多