Подтвердить что ты не робот

Может ли PHP указать, является ли сервер os 64-битным?

Я имею дело с Windows здесь.

Я знаю, что вы можете использовать переменную $_SERVER['HTTP_USER_AGENT'] для обнаружения ОС браузера, просматривающего страницу, но каким образом PHP может обнаружить серверную ОС?

Для моего пользовательского интерфейса программы я использую веб-страницу PHP. Мне нужно прочитать ключ в реестре, который находится в другом месте в 64-разрядной ОС (он находится под ключом Wow6432Node).

Может ли PHP указать, на какой ОС он работает? Может ли PHP указать, является ли ОС 64-разрядной или 32-разрядной?

4b9b3361

Ответ 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