Может ли PHP указать, является ли сервер os 64-битным?
Я имею дело с Windows здесь.
Я знаю, что вы можете использовать переменную $_SERVER['HTTP_USER_AGENT']
для обнаружения ОС браузера, просматривающего страницу, но каким образом PHP может обнаружить серверную ОС?
Для моего пользовательского интерфейса программы я использую веб-страницу PHP. Мне нужно прочитать ключ в реестре, который находится в другом месте в 64-разрядной ОС (он находится под ключом Wow6432Node
).
Может ли PHP указать, на какой ОС он работает? Может ли PHP указать, является ли ОС 64-разрядной или 32-разрядной?
Ответы
Ответ 1
Примечание. Это решение немного менее удобно и медленнее, чем @Salman A answer. Я бы посоветовал вам использовать его решение и проверить PHP_INT_SIZE == 8
, чтобы узнать, находитесь ли вы на 64-битной ОС.
Если вы просто хотите ответить на 32-битный/64-битный вопрос, такая проницательная маленькая функция, как это, сделает трюк (используя метод intval function для обработки ints на основе 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 бит)...
Ответ 2
Чтобы проверить размер целого (4/8 байт), вы можете использовать константу PHP_INT_SIZE
. Если PHP_INT_SIZE===8
, то у вас есть 64-битная версия PHP. PHP_INT_SIZE===4
подразумевает, что используется 32-разрядная версия PHP, но это не означает, что ОС и/или процессор 32-разрядные.
В Windows + IIS существует переменная $_SERVER["PROCESSOR_ARCHITECTURE"]
, содержащая x86
при тестировании в моей системе (WinXP-32bit). Я думаю, что он будет содержать x64
при работе на 64-битной ОС.
Ответ 3
Несколько более короткий и более надежный способ получить количество бит.
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;
}
Ответ 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'];
Это возвращает следующую строку на моем ibm t400 с запуском Win 7 (64 бит)...
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');
Вероятно, вам придется использовать комбинацию методов, если вы планируете поддерживать множество разных ОС.
Ответ 5
Или используйте 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
Мне повезло с бит-сдвигом и использование булевых кастингов.
function is64bit()
{
return (bool)((1<<32)-1);
}
// or
function is32bit()
{
return 1<<32 === 1;
}
Ответ 7
вы можете использовать некоторые script для вывода типа Os
здесь приведен пример того, как получить эту информацию с помощью WMI.
Вы можете вызвать этот script с помощью exec
и прочитать вывод.
Ответ 8
Немного позднего ответа, но если вы просто хотите определить размер слова, вы можете использовать это:
(log(PHP_INT_MAX + 1, 2) + 1)
Ответ 9
если у вас установлено расширение COM
(в php.ini), вы можете вызвать службу WMI Windows.
Чтобы проверить ОС:
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";
}
Ответ 10
Не нужно делать расчеты. Просто проверьте константу PHP_INT_SIZE:
if(PHP_INT_SIZE>4)
// 64 bit code
else
// 32 bit code
Размер целых чисел является хорошим индикатором, но не пуленепробиваемым. Кто-то может запустить 32-битное приложение в 64-разрядной системе.
$_ SERVER ['SERVER_SOFTWARE'] и $_SERVER ['SERVER_SIGNATURE'] могут сообщить вам что-то полезное, в зависимости от реализации сервера.
Ответ 11
Ниже приведено однострочное решение для определения того, выполняется ли PHP в режиме с 64-разрядным или 32-разрядным:
empty(strstr(php_uname("m"), '64')) ? $php64bit = false : $php64bit = true;
После выполнения строки кода выше переменной $php64bit
будет установлено значение true
или false