我在这里处理Windows。
我知道你可以使用$_SERVER['HTTP_USER_AGENT']
variables来检测浏览器查看页面的操作系统,但是PHP可以检测到服务器的操作系统的任何方式吗?
对于我的程序的用户界面,我正在使用PHP网页。 我需要读取位于64位操作系统上不同位置的registry中的密钥(位于Wow6432Node
密钥下)。
PHP可以告诉它在哪个操作系统上运行? PHP可以告诉操作系统是64位还是32位?
注意:这个解决方案比@Salman A的答案稍微方便一些,速度也慢一些。 我会建议你使用他的解决方案,并检查 PHP_INT_SIZE == 8
,看看你是否在64位操作系统。
如果你只是想回答32bit / 64bit的问题,像这样一个鬼鬼祟祟的小函数会做的伎俩(利用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位)…
要检查整数的大小(4/8字节),可以使用PHP_INT_SIZE
常量。 如果PHP_INT_SIZE===8
那么你有一个64位版本的PHP。 PHP_INT_SIZE===4
意味着正在使用32位版本的PHP,但并不意味着操作系统和/或处理器是32位的。
在Windows + IIS上有一个$_SERVER["PROCESSOR_ARCHITECTURE"]
变量,在我的系统(WinXP-32bit)上进行测试时,它包含x86
。 我认为它将在64位操作系统上运行时包含x64
。
一个稍微更短,更强大的方式来获得位数。
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; }
尝试使用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。
你可以得到一般的处理器信息(在* nix服务器上),通过使用cmd …
echo system('cat /proc/cpuinfo');
如果您计划支持许多不同的操作系统,您可能需要使用这些方法的组合。
或者使用PHP COM来调用wmi
$obj = new COM('winmgmts://localhost/root/CIMV2'); $wmi = $obj->ExecQuery('Select * from Win32_OperatingSystem'); foreach($wmi as $wmiCall) { $architecture = $wmiCall->OSArchitecture; }
我已经有点转移的运气,并利用布尔铸造。
function is64bit() { return (bool)((1<<32)-1); } // or function is32bit() { return 1<<32 === 1; }
您可以使用一些脚本来输出Os类型
这里有一个如何使用WMI获取信息的例子。
你可以使用exec
调用这个脚本并读取输出。
有点迟到的答案,但如果你只是想确定字的大小,你可以使用这个: (log(PHP_INT_MAX + 1, 2) + 1)
如果您安装了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"; }
不需要做计算。 只需检查PHP_INT_SIZE常量:
if(PHP_INT_SIZE>4) // 64 bit code else // 32 bit code
整数的大小是一个很好的指标,但不是防弹的。 有人可能会在64位系统上运行一个32位的应用程序。
$ _SERVER ['SERVER_SOFTWARE']和$ _SERVER ['SERVER_SIGNATURE']可能会告诉你一些有用的信息,这取决于服务器的实现。
这是一个单行的解决方案,以确定PHP是否在64位或32位模式下执行:
empty(strstr(php_uname("m"), '64')) ? $php64bit = false : $php64bit = true;
执行$php64bit
变量上面的代码行后,将被设置为true
或false