Определение битности ОС из PHP


Иногда бывают и такие задачи, мое решение под катом, возможно кто знает более простой способ?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
switch (true) {
    case (0x7FFF > (int)(0x7FFF+1)): // 2^15-1
        define('PHP_OS_BIT', 16);
        break;
    case (0x7FFFFFFF > (int)(0x7FFFFFFF+1)): // 2^31-1
        define('PHP_OS_BIT', 32);
        break;
    case (0x7FFFFFFFFFFFFFFF > (int)(0x7FFFFFFFFFFFFFFF+1)): // 2^63-1
        define('PHP_OS_BIT', 64);
        break;
    case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF > (int)(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+1)): // 2^127-1
        define('PHP_OS_BIT', 128);
        break;
    default:
        define('PHP_OS_BIT', 8);
        break;
}
var_dump(PHP_OS);
var_dump(PHP_OS_BIT);

Можно использовать константу PHP_INT_MAX, но есть зависимость от версии PHP:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
switch (PHP_INT_MAX) {
    case (0x7FFF): // 2^15-1
        define('PHP_OS_BIT', 16);
        break;
    case (0x7FFFFFFF): // 2^31-1
        define('PHP_OS_BIT', 32);
        break;
    case (0x7FFFFFFFFFFFFFFF): // 2^63-1
        define('PHP_OS_BIT', 64);
        break;
    case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF): // 2^127-1
        define('PHP_OS_BIT', 128);
        break;
    default:
        define('PHP_OS_BIT', 8);
        break;
}

10 thoughts on “Определение битности ОС из PHP”

    1. У меня вот по работе случается так, что скрипты должны знать на какой архитектуре они работают. В зависимости от этого уже вычисления по разному происходят. Для 32 битных систем используется bcmath, а для 64 битных хватает стандартных функций.

  1. А что бывает пхп на чем-то 8битном? Спектрум ? Денди ?

  2. Только несколькими часами раньше столкнулся с разницей 32/64 в функции base_convert() при попытке преобразования 36-ой (0-9, a-z) в 10-ую (0-9). Спасибо.

  3. Да. РНР на 8битной ОС это было бы круто))
    Даешь РНР на Спектруме

  4. PHP_INT_MAX ( integer )
    Available since PHP 4.4.0 and PHP 5.0.5

    Думаю сейчас мало таких динозавров, у которых установлена ранняя версия.
    С помощью этой константы я бы проверял так:

    1
    2
    $base = log(PHP_INT_MAX*2+2, 2);
    /* От максимального положительного значения до минимального (которое на 1 больше) и 0. Берем логарифм по основанию 2 и получаем количество бит в записи инта */

    Но почему не легче сделать так?

    1
    $base = PHP_INT_SIZE*8;
  5. Т.е в существующих реалиях вполне хватит

    1
    define('PHP_OS_BIT', PHP_INT_MAX === 0x7FFFFFFF ? 32 : 64);

    Если нужно универсальное решение которое будет работать без обновлений даже на РНР-9.3.1 1024-бит, то тут сам по себе подход надо менять, switch это не дело…

    В прочем как уже сказали выше проще всего

    1
    define('PHP_OS_BIT', PHP_INT_SIZE << 3);

    Ну а если сугубо посмеяться, я бы предложил так

    1
    2
    3
    4
    5
    $bits = 1;
    for ($i = PHP_INT_MAX + 1; $i != 1; $i /= 2 ) {
        $bits++;
    };
    define('PHP_OS_BIT', $bits);
  6. Впрочем есть вариант и без констант…

    1
    2
    for ($i=1; is_int(pow(2,$i)); $i++) {}
    define('PHP_OS_BIT', ++$i);

    (думаю сработает даже на РНР3, но под рукой нету)

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.