Может ли PHP сказать, является ли сервер ОС 64-битным? - PullRequest
24 голосов
/ 01 марта 2010

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

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

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

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

Ответы [ 12 ]

30 голосов
/ 25 марта 2011

Примечание. Это решение немного менее удобно и медленнее, чем @ ответ Салмана А. . Я бы посоветовал вам использовать его решение и проверить на PHP_INT_SIZE == 8 , чтобы увидеть, если вы на 64-битной ОС.

Если вы просто хотите ответить на 32-битный / 64-битный вопрос, небольшая хитрая функция, как эта, сработает (воспользовавшись способом обработки int для функции int, основанной на 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-битную) ...

26 голосов
/ 10 июня 2011

Чтобы проверить размер целого числа (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-битной ОС.

12 голосов
/ 14 августа 2012

Немного более короткий и надежный способ получения количества бит.

    strlen(decbin(~0));

Как это работает:

Оператор побитового дополнения, тильда, ~ , переворачивает каждый бит.

@ см. http://php.net/manual/en/language.operators.bitwise.php

Использование этого параметра 0 включает каждый бит для целого числа.

Это дает вам наибольшее число, которое может обработать ваша установка PHP.

Тогда использование decbin () даст вам строковое представление этого числа в двоичной форме

@ см. http://php.net/manual/en/function.decbin.php

и strlen подсчитает количество бит.

Вот оно в полезной функции

function is64Bits() {
    return strlen(decbin(~0)) == 64;
}
7 голосов
/ 01 марта 2010

Попробуйте использовать функцию 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');

Вероятно, вам придется использовать комбинацию методов, если вы планируете поддерживать множество различных ОС.

3 голосов
/ 20 февраля 2014

Мне повезло со сдвигом битов и использованием булевых кастов.

function is64bit()
{
  return (bool)((1<<32)-1);
}
// or
function is32bit()
{
  return 1<<32 === 1;
}
2 голосов
/ 06 сентября 2012

Или используйте PHP COM для вызова wmi

$obj = new COM('winmgmts://localhost/root/CIMV2');
$wmi = $obj->ExecQuery('Select * from Win32_OperatingSystem');
foreach($wmi as $wmiCall)
{
    $architecture = $wmiCall->OSArchitecture;
}
1 голос
/ 01 марта 2010

Вы можете использовать некоторый скрипт для вывода типа Os

здесь есть пример того, как получить эту информацию с помощью WMI.

Вы можете вызвать этот скрипт с помощью exec и прочитать вывод.

0 голосов
/ 17 января 2018

Рассматривая все эти ответы и некоторые другие решения + моя идея «напрямую спросить компьютер», я получаю это универсальное решение:

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;
}

Испытано на различных машинах, и пока у меня есть положительные результаты.Не стесняйтесь использовать, если вы видите какую-либо цель.

0 голосов
/ 30 марта 2016

Вот решение в одну строку, чтобы определить, выполняется ли PHP в 64-битном или 32-битном режиме:

empty(strstr(php_uname("m"), '64')) ?  $php64bit = false : $php64bit = true; 

После выполнения строки кода над переменной $php64bit будет установлено значение true или false

0 голосов
/ 01 января 2016

Нет необходимости делать расчеты. Просто проверьте константу PHP_INT_SIZE:

if(PHP_INT_SIZE>4)
  // 64 bit code
else
  // 32 bit code

Размер целых чисел является хорошим показателем, но не пуленепробиваемым. Кто-то может запустить 32-битное приложение в 64-битной системе.

$ _ SERVER ['SERVER_SOFTWARE'] и $ _SERVER ['SERVER_SIGNATURE'] могут рассказать вам кое-что полезное, в зависимости от реализации сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...