【问题标题】:Can PHP tell if the server os is 64-bit?PHP 可以判断服务器操作系统是否为 64 位吗?
【发布时间】:2011-01-22 03:32:00
【问题描述】:

我在这里处理的是 Windows。

我知道你可以使用$_SERVER['HTTP_USER_AGENT']变量来检测浏览页面的浏览器的操作系统,但是PHP有什么方法可以检测服务器的操作系统吗?

对于我的程序 UI,我使用的是 PHP 网页。我需要读取注册表中位于 64 位操作系统上不同位置的键(它位于 Wow6432Node 键下)。

PHP 可以判断它运行在什么操作系统上吗? PHP 可以判断操作系统是 64 位还是 32 位?

【问题讨论】:

  • 先尝试 Wow6432Node 密钥,然后再尝试普通的 32 位密钥(如果它不存在)可能会更容易。
  • 你看过$_ENV吗?

标签: php windows 32bit-64bit


【解决方案1】:

注意:这个解决方案比@Salman A's answer 有点不方便和慢。我建议您使用他的解决方案并检查 PHP_INT_SIZE == 8 看看您是否使用 64 位操作系统。

如果您只是想回答 32 位/64 位的问题,那么像这样的鬼鬼祟祟的小函数就可以解决问题(利用 intval 函数处理基于 32/64 位的整数的方式。)

<?php
function is_64bit()
{
    $int = "9223372036854775807";
    $int = intval($int);
    if ($int == 9223372036854775807) {
        /* 64bit */
        return true;
    } elseif ($int == 2147483647) {
        /* 32bit */
        return false;
    } else {
        /* error */
        return "error";
    }
}
?>

您可以在此处查看正在运行的代码:http://ideone.com/JWKIf

注意:如果操作系统是64位但运行的是32位版本的php,该函数将返回false(32位)...

【讨论】:

  • 当您可以检查 PHP_INT_SIZE 常量时,为什么还要使用函数调用? @Salman A 的回答要好得多。
  • 我实际上同意你的观点,我想我会编辑我的答案以将人们与他的答案联系起来......
【解决方案2】:

要检查整数的大小(4/8 字节),您可以使用PHP_INT_SIZE 常量。如果PHP_INT_SIZE===8 则您拥有的是 64 位版本的 PHP。 PHP_INT_SIZE===4 表示正在使用 32 位版本的 PHP,但并不表示操作系统和/或处理器是 32 位的。

在 Windows+IIS 上有一个 $_SERVER["PROCESSOR_ARCHITECTURE"] 变量,在我的系统(WinXP-32 位)上测试时包含 x86。我认为它在 64 位操作系统上运行时会包含 x64

【讨论】:

  • 在 CLI PHP_INT_SIZE===4 中的 Windows 7 家庭高级版(64 位)上。我认为 Windows 限制了这一点。查看 Chris0 的答案,以更安全的方式检测此问题。
  • @serbanghita 我猜你可能在 64 位操作系统上运行 32 位版本的 php。
【解决方案3】:

一种更短且更健壮的获取位数的方法。

    strlen(decbin(~0));

这是如何工作的:

按位补码运算符,波浪号 ~ 翻转每一位。

@见http://php.net/manual/en/language.operators.bitwise.php

0 上使用它会打开整数的每一位。

这为您提供了 PHP 安装可以处理的最大数量。

然后使用 decbin() 将为您提供此数字的二进制形式的字符串表示

@见http://php.net/manual/en/function.decbin.php

strlen 会给你位数。

这是一个可用的函数

function is64Bits() {
    return strlen(decbin(~0)) == 64;
}

【讨论】:

  • 这是一个很好的答案,但在这个问题中请求的操作系统的位,并且您正在测试 php 的位。但是即使操作系统已经是 64 位,php 仍然可以使用 32 位 INT 运行。例如。低于版本 7 的 php 在 windows 中总是有 32 位整数 @see: php.net/manual/language.types.integer.php
【解决方案4】:

尝试使用 php_uname 函数...

<?php
echo php_uname('s');/* Operating system name */
echo "<br />";
echo php_uname('n');/* Host name */
echo "<br />";
echo php_uname('r');/* Release name */
echo "<br />";
echo php_uname('v');/* Version information */
echo "<br />";
echo php_uname('m');/* Machine type */
echo "<br />";
echo PHP_OS;/* constant will contain the operating system PHP was built on */
?>

来源 - 确定操作系统 - http://www.sitepoint.com/forums/showthread.php?t=510565

另一种方法是使用...

 echo $_SERVER['SERVER_SOFTWARE']; 

这将在运行 Win 7(64 位)的 ibm t400 上返回以下字符串...

Apache/2.2.12 (Win32) DAV/2 mod_ssl/2.2.12 OpenSSL/0.9.8k mod_autoindex_color PHP/5.3.0 mod_perl/2.0.4 Perl/v5.10.0

不幸的是,它返回 WIN32,因为我运行的是 32 位版本的 apache。

您可以使用 cmd... 获取一般处理器信息(在 *nix 服务器上)...

echo system('cat /proc/cpuinfo');

如果您计划支持多种不同的操作系统,您可能需要结合使用这些方法。

【讨论】:

  • 使用system(),依赖/proc的布局。我最不喜欢的两件事。
  • 我同意,您将需要尝试使用系统 cmd 来获取正确的信息,即便如此,如果您的 Apache 是 32 位的,那么您在该服务器应用程序中会受到限制。
  • Asveikau,同意,但不幸的是,没有一个可靠的方法。唯一的解决方案是使用混搭,并且可能依赖 system() 作为最后的手段。
【解决方案5】:

我在移位和利用布尔转换方面很幸运。

function is64bit()
{
  return (bool)((1<<32)-1);
}
// or
function is32bit()
{
  return 1<<32 === 1;
}

【讨论】:

    【解决方案6】:

    或者使用PHP COM调用wmi

    $obj = new COM('winmgmts://localhost/root/CIMV2');
    $wmi = $obj->ExecQuery('Select * from Win32_OperatingSystem');
    foreach($wmi as $wmiCall)
    {
        $architecture = $wmiCall->OSArchitecture;
    }
    

    【讨论】:

      【解决方案7】:

      你可以使用一些脚本来输出Os类型

      here 有一个如何使用 WMI 获取该信息的示例。

      您可以使用exec 调用此脚本并读取输出。

      【讨论】:

        【解决方案8】:

        如果您安装了COM 扩展(在 php.ini 中),您可以调用 windows WMI 服务。

        检查操作系统:

        function getOsArchitecture() {
            $wmi = new COM('winmgmts:{impersonationLevel=impersonate}//./root/cimv2');
            $wmi = $obj->ExecQuery('SELECT * FROM Win32_OperatingSystem');
            if (!is_object($wmi)) {
                throw new Exception('No access to WMI. Please enable DCOM in php.ini and allow the current user to access the WMI DCOM object.');
            }
            foreach($wmi as $os) {
                return $os->OSArchitecture;
            }
            return "Unknown";
        }
        

        或者,检查物理处理器:

        function getProcessorArchitecture() {
            $wmi = new COM('winmgmts:{impersonationLevel=impersonate}//./root/cimv2');
        
            if (!is_object($wmi)) {
                throw new Exception('No access to WMI. Please enable DCOM in php.ini and allow the current user to access the WMI DCOM object.');
            }
            foreach($wmi->ExecQuery("SELECT Architecture FROM Win32_Processor") as $cpu) {
                # only need to check the first one (if there is more than one cpu at all)
                switch($cpu->Architecture) {
                    case 0:
                        return "x86";
                    case 1:
                        return "MIPS";
                    case 2:
                        return "Alpha";
                    case 3:
                        return "PowerPC";
                    case 6:
                        return "Itanium-based system";
                    case 9:
                        return "x64";
                }
            }
            return "Unknown";
        }
        

        【讨论】:

          【解决方案9】:

          无需计算。只需检查 PHP_INT_SIZE 常量:

          if(PHP_INT_SIZE>4)
            // 64 bit code
          else
            // 32 bit code
          

          整数的大小是一个很好的指标,但不是万无一失的。有人可能会在 64 位系统上运行 32 位应用程序。

          $_SERVER['SERVER_SOFTWARE'] 和 $_SERVER['SERVER_SIGNATURE'] 可能会告诉您一些有用的信息,具体取决于服务器的实现。

          【讨论】:

            【解决方案10】:

            答案有点晚了,但如果你只是想确定字长,你可以使用这个: (log(PHP_INT_MAX + 1, 2) + 1)

            【讨论】:

              【解决方案11】:

              这里有一个单行解决方案来确定 PHP 是在 64 位还是 32 位模式下执行:

              empty(strstr(php_uname("m"), '64')) ?  $php64bit = false : $php64bit = true; 
              

              执行上面的代码行后,$php64bit 变量将被设置为truefalse

              【讨论】:

                【解决方案12】:

                查看所有这些答案和其他一些解决方案 + 我“直接询问计算机”的想法,我得到了这个通用解决方案:

                function is_64bit()
                {
                    // Let's ask system directly
                    if(function_exists('shell_exec'))
                    {
                
                        if (in_array(strtoupper(substr(PHP_OS, 0, 3)), array('WIN'), true) !== false || defined('DIRECTORY_SEPARATOR') && '\\' === DIRECTORY_SEPARATOR)
                        {
                            // Is Windows OS
                            $shell = shell_exec('wmic os get osarchitecture');
                            if(!empty($shell))
                            {
                                if(strpos($shell, '64') !== false)
                                    return true;
                            }
                        }
                        else
                        {
                            // Let's check some UNIX approach if is possible
                            $shell = shell_exec('uname -m');
                            if(!empty($shell))
                            {
                                if(strpos($shell, '64') !== false)
                                    return true;
                            }
                        }
                    }
                
                    // Check is PHP 64bit (PHP 64bit only running on Windows 64bit version)
                    if (version_compare(PHP_VERSION, '5.0.5') >= 0)
                    {
                        if(defined('PHP_INT_SIZE') && PHP_INT_SIZE === 8)
                            return true;
                    }
                
                    // bit-shifting can help also if PHP_INT_SIZE fail
                    if((bool)((1<<32)-1))
                        return true;
                
                    // Let's play with bits again but on different way
                    if(strlen(decbin(~0)) == 64)
                        return true;
                
                    // Let's do something more worse but can work if all above fail
                    // The largest integer supported in 64 bit systems is 9223372036854775807. (https://en.wikipedia.org/wiki/9,223,372,036,854,775,807)
                    $int = '9223372036854775807';
                    if (intval($int) == $int)
                        return true;
                
                    return false;
                }
                

                在各种机器上进行了测试,现在我得到了积极的结果。如果您看到任何用途,请免费使用。

                【讨论】:

                • 只有您的 shell_exec 测试是针对操作系统的测试,其他测试是针对 php 的测试。例如。如果您在 Windows 中运行低于版本 7 的 php,即使您的操作系统是 64 位,它们也将始终提供 32 位。
                • 是的。但如果返回 32bit,则在该函数的其他步骤中会继续搜索 64bit 的值。如果shell_exec 失败,它将尝试使用PHP_INT_SIZE,移位或搜索整数的最大值。到目前为止,此功能从未失败过,并且在 WordPress 插件中的 2 多个 minion 安装中工作。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-05-09
                • 2012-08-26
                • 2023-03-15
                • 2019-04-26
                • 2011-09-05
                • 2011-10-11
                • 1970-01-01
                相关资源
                最近更新 更多