Проверка, работает ли ваш код на 64-битном PHP

Кто-нибудь знает способ проверки в PHP, работает ли скрипт как 32-битный или 64-битный? В настоящее время я использую PHP 5.3.5.

В идеале я хотел бы написать функцию, чтобы мой код мог выглядеть так:

if( is_32bit() === true ) {
    do_32bit_workaround();
}
do_everything_else();

У кого-нибудь есть мысли?

5 ответов

Решение

Проверить PHP_INT_SIZE постоянная. Это будет варьироваться в зависимости от размера регистра (то есть 32-разрядный или 64-разрядный).

В 32-битных системах PHP_INT_SIZE должно быть 4, для 64-битной это должно быть 8.

См. http://www.php.net/manual/en/language.types.integer.php для получения дополнительной информации.

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

Для Windows:

php -r "echo (PHP_INT_SIZE == 4 ? '32 bit' : '64 bit').PHP_EOL;" && php -i | findstr Thread

Для Linux

php -r "echo (PHP_INT_SIZE == 4 ? '32 bit' : '64 bit').PHP_EOL;" && php -i | grep Thread

Пример вывода:

64 bit
Thread Safety => disabled

Вы можете написать такую ​​функцию:

function is_32bit(){
  return PHP_INT_SIZE === 4;
}

Тогда вы можете использовать пример кода, который вы разместили:

if ( is_32bit() ) {
    do_32bit_workaround();
} else {
    do_everything_else();
}

Короткий способ получить количество бит.

    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 is32Bits() {
    return strlen(decbin(~0)) == 32;
}

Попробуйте эту простую функцию PHP

<?php

function maxBit()
{
    list($return, $number) = array(0, 0);

    // Start process
    while (true) {
        // Get number at x bits
        $numX = intval(bcsub(bcpow('2', "{$return}"), '1'));
        // Check number
        if ($numX != 0 && $number == $numX) {
            break;
        }
        // Update number
        $number = $numX;
        // Update return value
        $return++;
    }

    return $return;
}

// Check is 64bit
if (maxBit() == 64) {
    // Write your code here...
}

Я просто огляделся и не нашел ничего слишком многообещающего. Есть хороший шанс, что вы можете использовать $_SERVER['SERVER_SOFTWARE'] сказать (проверить, что он печатает в вашей системе), но сделать его портативным и всегда точным, вероятно, невозможно.

Другие вопросы по тегам