Я имею дело с Windows здесь.
Я знаю, что вы можете использовать переменную $_SERVER['HTTP_USER_AGENT']
для обнаружения ОС браузера, просматривающего страницу, но каким образом PHP может обнаружить ОС сервера?
Для пользовательского интерфейса моей программы я использую веб-страницу PHP. Мне нужно прочитать ключ в реестре, который находится в другом месте в 64-битной ОС (он находится под ключом Wow6432Node
).
Может ли PHP рассказать, на какой ОС он работает? Может ли PHP указать, является ли ОС 64-разрядной или 32-разрядной?
Примечание. Это решение немного менее удобно и медленнее, чем ответ @Salman A. Я бы посоветовал вам использовать его решение и проверить на PHP_INT_SIZE == 8
чтобы узнать, находитесь ли вы на 64-битной ОС.
Если вы просто хотите ответить на 32-битный / 64-битный вопрос, такая проницательная небольшая функция, как это, сделает трюк (воспользовавшись методом intval-функции для обработки 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 бит) …
Чтобы проверить размер целого (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-битной ОС.
Немного более короткий и более надежный способ получить количество бит.
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'];
Это возвращает следующую строку на моем 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');
Вероятно, вам придется использовать комбинацию методов, если вы планируете поддерживать множество разных ОС.
Или используйте PHP COM для вызова wmi
$obj = new COM('winmgmts://localhost/root/CIMV2'); $wmi = $obj->ExecQuery('Select * from Win32_OperatingSystem'); foreach($wmi as $wmiCall) { $architecture = $wmiCall->OSArchitecture; }
Мне повезло с бит-сменой, и я использовал преимущество boolean casting.
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), вы можете вызвать службу 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"; }
Нет необходимости делать расчеты. Просто проверьте константу PHP_INT_SIZE:
if(PHP_INT_SIZE>4) // 64 bit code else // 32 bit code
Размер целых чисел является хорошим индикатором, но не пуленепробиваемым. Кто-то может запустить 32-битное приложение на 64-битной системе.
$ _SERVER ['SERVER_SOFTWARE'] и $ _SERVER ['SERVER_SIGNATURE'] могут сообщить вам что-то полезное, в зависимости от реализации сервера.
Вот однострочное решение, чтобы определить, выполняется ли PHP в режиме 64-битного или 32-битного:
empty(strstr(php_uname("m"), '64')) ? $php64bit = false : $php64bit = true;
После выполнения строки кода выше переменной $php64bit
будет установлено значение true
или false