JeuWeb - Crée ton jeu par navigateur
PHP microtime et serialize_precision - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : PHP microtime et serialize_precision (/showthread.php?tid=5524)



PHP microtime et serialize_precision - php_addict - 02-07-2011

bonsoir

alors là il m'arrive un truc de ouf...un truc a s'arracher les cheveux sur une pauvre ligne de code...j'explique:

je crée un token (jeton) que j'enregistre en session ainsi que le micro-timestamp de la creation du token (car au bout de XX minutes le jeton est réinitialisé) . pourquoi microtime() ? je ne sais plus mais il doit y avoir une raison, enfin bref là n'est pas le probleme.

$_SESSION['token_time'] = microtime(TRUE);

le soucis etant que parfois la valeur renvoyée par microtime() n'est pas le microtime actuel mais un microtime futur, par exemple ce matin 2 joueurs ont eu des microtime du 07-07-2011, c'est à dire dans 5 jours !!!

comment est possible que mon $_SESSION['token_time'] soit un microtime d'une date future (dans 5 jours) et en plus un chiffre rond à chaque fois:

$_SESSION['token_time'] = 1310000000 ;

je soupçonne php de déconner à fond les ballons...du coup j'ai regardé la doc et là Ô surprise:

ici : http://www.php.net/manual/fr/function.microtime.php#99524 microtime semble avoir un comportement complétement hallucinant...

j'hallucine un max ou c'est le microtime() de php qui foire?

avez-vous déjà entendu parlé d'une telle horreur ?

a+


RE: PHP microtime bug et comportement etrange - php_addict - 02-07-2011

PS: est ce que cela peut venir du hardware de mon dédié? car l'horloge de mon dédié prends de l'avance (+7 minutes en 3 mois)


echo date('d-m-Y' , 1310000000); // resultat ==> 07-07-2011



RE: PHP microtime bug et comportement etrange - Bertrand - 02-07-2011

Pour l'exemple auquel tu fais référence, c'est une erreur d'utilisation. Il utilise la fonction sans le flag pour avoir une valeur réelle. Donc son calcul de durée se fait uniquement sur la 1ère des 2 valeurs retournées (les microsecondes). Le résultat sera quasiment toujours foireux (à moins de faire les 2 mesures dans la même seconde), et aléatoirement négatif.

Par contre, pour ton problème, tu dois avoir une instruction dans un coin qui fais l'approximation que tu constates.


RE: PHP microtime bug et comportement etrange - Sephi-Chan - 02-07-2011

N'avais-tu pas utilisé une option pour limiter la précision de tes flottants suite à une remarque dans un topic récent ?


RE: PHP microtime bug et comportement etrange - php_addict - 02-07-2011

(02-07-2011, 01:31 PM)Sephi-Chan a écrit : N'avais-tu pas utilisé une option pour limiter la précision de tes flottants suite à une remarque dans un topic récent ?

ahahah mais si:

Code :
ini_set('serialize_precision',4);

mais cet ini_set n'est que sur deux petits scripts et en principe il devrait me laisser 4 chiffres après la virgule...



RE: PHP microtime bug et comportement etrange - Bertrand - 02-07-2011

A priori c'est çà.
Le paramètre indique le nombre (4 en l’occurrence) de chiffres significatifs. Donc il garde les 4 premiers, en faisant un arrondi au plus proche, et ça te donne 1310 et des 0 derrière.

Exemple:
Code :
$v=123456.78;
echo "v=".serialize($v)."<BR/>";
ini_set('serialize_precision',6);
echo "v=".serialize($v)."<BR/>";
ini_set('serialize_precision',5);
echo "v=".serialize($v)."<BR/>";
ini_set('serialize_precision',4);
echo "v=".serialize($v)."<BR/>";

Résultat :
Code :
v=d:123456.77999999999883584678173065185546875;
v=d:123457;
v=d:1.2346E+5;
v=d:1.235E+5;



RE: PHP microtime bug et comportement etrange - php_addict - 02-07-2011

ok, merci mille fois à vous deux, je commençais à devenir dingo...

mais alors que me conseillez vous pour la sérialisation des floating number ? (topic http://www.jeuweb.org/showthread.php?tid=7765 )

PS: peut être serait-il judicieux de fusionner ce topic avec http://www.jeuweb.org/showthread.php?tid=7765 ?


RE: PHP microtime bug et comportement etrange - niahoo - 02-07-2011

hum je n'ai pas tout compris à vos explications… pasque en utilisant microtime(true), on récupère un flottant, dont la partie entière correspond au timestamp actuel, donc la date devrait se faire sur cette partie (et être en avance si le dédié prend de l'avance).

mais en aucun cas la valeur récupérée ne devrait être la partie décimale arrondie à 4 chiffres et récupérée sous forme d'entier (13100000etc), non ?


RE: PHP microtime bug et comportement etrange - Bertrand - 02-07-2011

Le problème vient de la sérialisation de la session, qui est impactée par l'appel à ini_set.