我在这里处理Windows。
我知道您可以使用$_SERVER['HTTP_USER_AGENT']
变量来检测浏览页面的浏览器的操作系统,但PHP可以通过哪种方式检测服务器的操作系统?
对于我的程序的UI,我使用的是PHP网页。我需要读取位于64位操作系统上不同位置的注册表中的密钥(位于Wow6432Node
密钥下)。
PHP可以告诉它运行的操作系统是什么吗? PHP可以判断操作系统是64位还是32位?
答案 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)
答案 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
变量将设置为true
或false
答案 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;
}
在各种机器上进行测试,现在我得到了积极的结果。如果你看到任何目的,可以免费使用。