PHP可以告诉服务器操作系统是64位吗?

时间:2010-03-01 01:47:23

标签: php windows 32bit-64bit

我在这里处理Windows。

我知道您可以使用$_SERVER['HTTP_USER_AGENT']变量来检测浏览页面的浏览器的操作系统,但PHP可以通过哪种方式检测服务器的操作系统?

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

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

12 个答案:

答案 0 :(得分:30)

注意:此解决方案不如@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位)......

答案 1 :(得分:26)

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

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

答案 2 :(得分:12)

获得位数的稍微更短且更健壮的方法。

    strlen(decbin(~0));

这是如何运作的:

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

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

0 上使用此功能可在每个位上切换整数。

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

然后使用decbin()将以二进制形式

为您提供此数字的字符串表示形式

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

并且strlen将为您提供位数。

这是一个可用的功能

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

答案 3 :(得分:7)

尝试使用 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');

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

答案 4 :(得分:3)

我已经幸运地进行了位移,并利用了布尔铸造。

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

答案 5 :(得分:2)

或者使用PHP COM来调用wmi

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

答案 6 :(得分:1)

您可以使用某些脚本输出Os类型

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

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

答案 7 :(得分:0)

有点迟到的答案,但如果您只是想确定字号,可以使用: (log(PHP_INT_MAX + 1, 2) + 1)

答案 8 :(得分:0)

如果你安装了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 :(得分:0)

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

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

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

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

答案 10 :(得分:0)

这是一个确定PHP是以64位还是32位模式执行的单行解决方案:

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

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

答案 11 :(得分:0)

查看所有这些答案以及其他一些解决方案+我的想法直接询问计算机&#34;我得到了这个通用的解决方案:

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

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