Question

week-end dernier, je changé webhosts pour mon site Web. Le serveur hôte j'étais sur un système d'exploitation est 32 bits et l'une je me suis déplacé à 64 bits. Contre toute attente, certains de mes scripts PHP a commencé à donner des résultats incorrects.

Dans mon cas, les opérations et << >> (décalage binaire) ont été le coupable. J'ai fini par avoir à masquer le résultat avec 0xFFFFFFFF puis changer le résultat si négatif pour que cela fonctionne comme avant.

Y at-il d'autres problèmes possibles dans mes scripts PHP je rechercher?

Était-ce utile?

La solution

Il est un langage de haut niveau, donc rien non bits lié (opérateurs, BitShift au niveau du bit) sera le même.

Autres conseils

Un entier peut être 64bit au lieu de 32 bits. Il y a quelques où cela peut causer des problèmes.

manipulation de bits nécessite un soin particulier à faire entre les systèmes portables / architectures.

En C, << et >> peuvent être des opérations portables en utilisant non signé variables, qui supprime les règles / twos compliment pour les nombres négatifs.

En règle générale, ne pas utiliser des masques de longueur fixe pour la manipulation de bits (comme & et |). Ceux-ci dépendent de l'architecture.

  

Par exemple. Remise à zéro des 4 derniers bits: le   masque 0xF0 travaillera sur un 8 bits   l'architecture, mais pas 16 bits. Les résultats seront différents (16 bits peut avoir d'autres bits qui sont établis qui ne sont pas inclus dans le masque).

     

Pour surmonter ce problème, utiliser l'opérateur ~. Le masque ~ 0xF est équivalent à 0xF0, mais travaillera sur any architecture. Tous les bits sauf les 4 derniers seront remis à zéro

strtotime se comporte différemment sur 64 bits. De PHP.net:

Note:

La plage valide d'un horodatage est généralement de Ven, 13 décembre 1901 20:45:54 UTC Mar 19 janvier 2038 03:14:07 UTC. (Ce sont les dates qui correspondent aux valeurs minimales et maximales pour un entier signé 32 bits.) En outre, toutes les plates-formes prennent en charge timestamp négatifs et donc votre plage de dates peut être limitée à au plus tôt à l'époque Unix. Cela signifie que par exemple dates avant le 1er Janvier 1970 ne fonctionnera pas sous Windows, certaines distributions Linux, et quelques autres systèmes d'exploitation. PHP 5.1.0 et les versions plus récentes outrepassent cette limitation.

Pour les versions 64 bits de PHP, la plage valide d'une estampille temporelle est effectivement infinie, comme 64 bits peuvent représenter environ 293 milliards années dans les deux sens.

Nous avions le code qui a été fait strtotime (0000-00-00) et attend le résultat faux, lorsque nous sommes passés à 64 bits, nous sommes revenus un entier négatif.

ce seul problème que vous verrez sont quand vous comptiez sur la représentation binaire 32 bits de données. Principalement parce que PHP utilise des entiers signés, vous verrez des problèmes dans Hashage, génération de clés, etc ... lors de la coulée explicitement int avec (int), les numéros> 2 ^ 32 envelopperont où qu'ils ne seront pas envelopper dans un environnement 64 bits sauf si elles sont> 2 ^ 64 bien sûr.

4 vs 8 bits par exemple:

Les questions de valeur décimale:

     0010 >> 1 =      0001   [ 1 dec ]
0000 0010 >> 1 = 0000 0001   [ 1 dec ]

Ces deux produisent le même résultat (décimal sage), cependant:

     0100 << 1 =      1000   [ -8 dec ]
0000 0100 << 1 = 0000 1000   [ 16 dec ]

Questions d'emballage:

     1000 << 1 =      0000   [  0 dec ]
0000 1000 << 1 = 0001 0000   [ 32 dec ]

Tout entier / flottant opérations ponctuelles seront traitées comme des valeurs 64 bits, donc si votre résultat final repose sur des morceaux de 32 bits vous devrez compenser tel.

Les résultats de division à virgule flottante seront affectés par l'augmentation de 64 bits; donc si vous avez du code qui fait quelque chose de stupide comme comparer les résultats de la division à virgule flottante à des constantes codées en dur, attendez-vous à briser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top