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


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

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:

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

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

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

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

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

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

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

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

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

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

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

    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.