Проверка, работает ли ваш код на 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']
сказать (проверить, что он печатает в вашей системе), но сделать его портативным и всегда точным, вероятно, невозможно.