Windows au pays des Timestamps
00:44 18 11 2005Beaucoup de personnes pensent, à tort, que tous les développements PHP (ne faisant pas d’appels système) s’executent de façon identique sur Unix ou Windows. Un exemple des légères différences que l’on peut rencontrer est la getion des timestamps Unix.
Un timestamp Unix est une unité de mesure du temps. Il s’agit du nombre de secondes écoulées depuis le 1er Janvier 1970 à 0h00. Ce format à été crée, au début de Unix, afin de palier aux problèmes de mémoire qui, bien avant que l’on ait des pc avec 1 Go de RAM, était très limitée (à l’époque, la mémoire se mesurait en octets). Ainsi, les dates consommaient des espaces mèmoire très réduits en sachant pertinement que plus on avancerait dans le temps et plus l’espace necessaire grandirait mais également que la mémoire disponible sur les machines serait de plus en plus importante.
En partant de ce concept, on en déduit rapidement qu’il n’est pas possible d’exprimer une date antérieure à 1970 avec un timestamp à moins d’utiliser une valeur négative.
Or Unix (ou Linux) sait très bien gérer ces valeurs négatives. un exemple simple :
<?php
echo mktime(0,0,0,1,1,1969);
?>
Ce petit script, qui génère le timestamp du 1er Janvier 1969 à 0h00, sous Unix vous affichera
-31539600
Maintenant testez ce même script sous Windows. Voilà l’affichage que vous aurez :
Warning: mktime() [function.mktime]: Windows does not support negative values for this function in c:\wamp\www\test\timestamp.php on line 3
-1
Windows ne sait pas gérer les valeurs négatives de timestamps! Et ceci peut entrainer de très grosses incohérences sur vos développements.
Conclusion : si vous souhaitez faire des développements multi plateformes, pensez à tester régulièrement votre travail sur toutes les plateformes que vous souhaitez supporter afin d’éviter de mauvaises surprises de dernière minute.
Et j’ajouterais à cette conclusion que pour cela, rien de mieux qu’un petit test unitaire pour s’assurer que ça roule parmi les 250 autres fonctionnalités à tester d’une plate-forme à l’autre ;).