Si tu ne souhaites pas avoir de retard ou le limité à une seconde, ne fonctionne pas explicitement en mode compte à rebours mais en date de fin.
Phase d'initialisation
Je n'ai pas testé mais le principe est là, tu devrais plus n'avoir de décalage.
Une des erreurs est de penser que tous le monde est correctement synchronisé.
Phase d'initialisation
var date_du_serveur_en_milliseconde = //Ton php
var date_du_rebours_restant_en_milliseconde = //Ton php
var delta_entre_serveur_et_la_machine = new Date().getTime() - date_serveur_en_milliseconde;
// Pour ne pas être décalé
date_du_rebours_restant_en_milliseconde = date_du_rebours_restant_en_milliseconde - delta_entre_serveur_et_la_machine;
Dans la fonction Rebours
var seconde_restante = parseInt((date_du_rebours_restant_en_milliseconde - new Date().getTime())/1000);
Je n'ai pas testé mais le principe est là, tu devrais plus n'avoir de décalage.
Une des erreurs est de penser que tous le monde est correctement synchronisé.