使用PHP查找Windows 32位或64位

16

有没有可能获取窗口处理器位数?我想使用php查找窗口处理器位数。我已经编写了代码来查找操作系统和其他属性。请给予建议。谢谢 - Haan


2
可能是https://dev59.com/63E95IYBdhLWcg3wV8a_的重复问题。 - Arend
服务器或客户端属性?请参考@Arend的链接获取服务器信息,对于客户端,您基本上只能使用用户代理标头中的信息(不使用某种插件)。 - ldg
2
你需要知道操作系统是32位还是64位,还是处理器?64位处理器可能运行着32位操作系统。 - Salman A
7个回答

43
<?php
switch(PHP_INT_SIZE) {
    case 4:
        echo '32-bit version of PHP';
        break;
    case 8:
        echo '64-bit version of PHP';
        break;
    default:
        echo 'PHP_INT_SIZE is ' . PHP_INT_SIZE;
}

这段代码至少可以告诉你正在运行的PHP版本是32位还是64位。


如果您在函数中使用此代码,则可能希望在默认情况下抛出异常,因为确定它是32位还是64位不安全。 - breiti
1
不幸的是,即使在Windows上运行64位PHP,整数仍然被限制为32位,因此您实际上无法确定安装了哪种类型的PHP(仅适用于Win)。但是,您可以根据操作系统的限制进行合理的猜测(例如,如果您使用的是32位Windows,则不能运行64位PHP)。 - doublehelix
@doublehelix 这已经不正确了。从Win10.1709开始,在x64平台上echo PHP_INT_SIZE报告8字节。但是,运行64位版本的PHP也有帮助。 - Daniel Rudy
更新:自PHP 7.0起,Windows平台现已完全支持64位(8字节)整数。 PHP 7直到2015年12月才发布。在2014年,PHP 5无法实现此功能。 - doublehelix
这个答案在技术上是不正确的,因为报告的大小对应于PHP进程,并且在64位操作系统中可以运行32位代码。 - Álvaro González

7

获取比特数的一种稍微简短且更加健壮的方法。

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

1
这个比PHP_INT_SIZE更健壮的原因是什么? - jdp
这再次报告的是PHP进程的能力,而不是操作系统的能力。 - Álvaro González
@jdp PHP_INT_SIZE是在5.0.5中引入的。decbin函数自版本4以来就存在了。 - sootsnoot
@sootsnoot PHP_INT_SIZE 自 v4.4 起就存在了。但是无论如何,现在没有人应该再使用 PHP v4 了。 - Turab

2
如果您已经安装了php.ini中的COM扩展,可以调用Windows WMI服务。

(请记住,即使您拥有64位处理器、64位操作系统和64位PHP,由于x64-PHP在Windows上的限制,您的整数仍将是32位。)

无论如何...

检查操作系统:

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

1
你可以编写这样的函数:

function functionName() {

function is_32bit(){
  return PHP_INT_SIZE === 4;
}

然后你可以像这样使用它:
if( is_32bit() ) {
    // do 32 bit stuffs
}

0
function bits() {
  return PHP_INT_SIZE * 8;
}

echo 'Php running on '.bits(). ' bits system';

0

另一种选择:

function IsAtLeast64Bit()
{
    return defined('PHP_INT_SIZE') && PHP_INT_SIZE >= 8;
}

只有在定义了PHP_INT_SIZE时,它才返回TRUE。这适用于所有64位系统。未来具有超过64位的系统也将得到管理。


-2

<?php echo $_SERVER['HTTP_USER_AGENT']; ?>
这段代码存储在变量中,您可以将其分解并从中获取信息。


4
注意:这将告诉你客户端正在运行的是32位还是64位操作系统,而不是服务器。 - user212218
我认为这就是他所问的,他想知道他的客户是否使用32/64位操作系统以便进行一些修改。 - Rohan Verma

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