quelqu'un sait-il comment avoir un entier 64 bits sur PHP? il semble que ce ne soit pas par fichier de configuration mais plutôt une option de compilation et cela dépend de la plate-forme?
Réponses
Trop de publicités?Notez que PHP sous Windows ne prend pas du tout en charge les entiers 64 bits, même si le matériel et PHP sont tous deux en 64 bits. Voir ce lien pour plus de détails:
Sur les fenêtres x86_64, PHP_INT_MAX est 2147483647. En effet, dans le code C sous-jacent, la longueur est 32 bits.
Toutefois, Linux sur x86_64 utilise une longueur de 64 bits, donc PHP_INT_MAX sera 9223372036854775807.
PHP int taille dépend de la plateforme. Il y a une fonction appelée unpack() qui permet de convertir différents types de données à partir de chaînes binaires à des variables PHP. Il semble être le seul moyen de stocker de 64 bits est de stocker une chaîne de caractères.
J'ai trouvé le code suivant: http://www.mysqlperformanceblog.com/2007/03/27/integers-in-php-running-with-scissors-and-portability/
/// portably build 64bit id from 32bit hi and lo parts
function _Make64 ( $hi, $lo )
{
// on x64, we can just use int
if ( ((int)4294967296)!=0 )
return (((int)$hi)<<32) + ((int)$lo);
// workaround signed/unsigned braindamage on x32
$hi = sprintf ( "%u", $hi );
$lo = sprintf ( "%u", $lo );
// use GMP or bcmath if possible
if ( function_exists("gmp_mul") )
return gmp_strval ( gmp_add ( gmp_mul ( $hi, "4294967296" ), $lo ) );
if ( function_exists("bcmul") )
return bcadd ( bcmul ( $hi, "4294967296" ), $lo );
// compute everything manually
$a = substr ( $hi, 0, -5 );
$b = substr ( $hi, -5 );
$ac = $a*42949; // hope that float precision is enough
$bd = $b*67296;
$adbc = $a*67296+$b*42949;
$r4 = substr ( $bd, -5 ) + + substr ( $lo, -5 );
$r3 = substr ( $bd, 0, -5 ) + substr ( $adbc, -5 ) + substr ( $lo, 0, -5 );
$r2 = substr ( $adbc, 0, -5 ) + substr ( $ac, -5 );
$r1 = substr ( $ac, 0, -5 );
while ( $r4>100000 ) { $r4-=100000; $r3++; }
while ( $r3>100000 ) { $r3-=100000; $r2++; }
while ( $r2>100000 ) { $r2-=100000; $r1++; }
$r = sprintf ( "%d%05d%05d%05d", $r1, $r2, $r3, $r4 );
$l = strlen($r);
$i = 0;
while ( $r[$i]=="0" && $i<$l-1 )
$i++;
return substr ( $r, $i );
}
list(,$a) = unpack ( "N", "\xff\xff\xff\xff" );
list(,$b) = unpack ( "N", "\xff\xff\xff\xff" );
$q = _Make64($a,$b);
var_dump($q);