Temporisation ?

Temporisation ? - PHP - Programmation

Marsh Posté le 05-06-2007 à 16:45:02    

Hey,
 
J'ai besoin de faire une temporisation (enfin j'ai envie qu'une partie du code ne séxécute que tous les X moments), et j'ai mis au point un système tout con, qui enregistre un timestamp dans un fichier txt, et qui le compare avec l'actuel. Avec un petit calcul, j'éxécute un code seulement si le dernier timestamp enregistré date d'au moins 2 minutes.
 
Voici le code:

Code :
  1. <?php
  2. $read = fopen("lastcheck.txt","r" );
  3. $timestamp = fread($read, filesize("lastcheck.txt" ));
  4. fclose($read);
  5. if($timestamp<=(time()-(120))) // Si ça fait plus de deux minutes
  6. {
  7. echo 'Dernier check : ' . date('d/m/Y à H:i',$timestamp) . ' - Enregistrement du timestamp';
  8. $read = fopen("lastcheck.txt","r+" );
  9. fseek($read, 0);
  10. fputs($read,time());
  11. fclose($read);
  12. }
  13. else
  14. {
  15. echo 'La dernière mise-à-jour a été faite il y a moins de 2 minutes.';
  16. }


 
Tout fonctionne à merveille. Seulement, dans un souci de perfectionnisme, j'aimerais améliorer mon truc.
Explication [:angelusdeus]. Imaginons mon script à grande échelle (une semaine par exemple). Un certain code doit s'éxécuter tous les Dimanche. J'éxécute le script pour la première fois un Dimanche, pour l'initialiser sur ce jour.
Un visiteur va se pointer le Mardi, et comme le timestamp actuel-7 jours sera plus petit que celui enregistré (c'est-à-dire si ça ne fait pas encore 7 jours), le code ne sera pas éxécuté. Jusque là tout va bien.
Maintenant, si aucun visiteur ne vient le dimanche, le script ne sera pas éxécuté, donc le timestamp ne sera pas mis à jour dans mon txt. Si un visiteur vient le lundi, le txt sera mis à jour, mais du coup, avec la vérification des 7 jours, la prochaine MAj sera faite... un lundi !
Or à la base mon script est conçu pour faire ses MAJ tous les Dimanche !
 
Comment faire pour que le script fonctionne correctement ? Merci beaucoup.

Reply

Marsh Posté le 05-06-2007 à 16:45:02   

Reply

Marsh Posté le 05-06-2007 à 16:47:44    

http://fr.wikipedia.org/wiki/Cron


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 05-06-2007 à 16:52:54    

Non mais avoue que ce serait useless de faire un cron là dessus, c'est un script tout con, pas une sauvegarde des BDDs.
Je crois avoir trouvé une piste (démonstration pour 2 minutes). On calcule  
(timestamp actuel - timestamp du fichier txt)/120, que l'on arrondit à l'entier supérieur:  

Code :
  1. $nb = ceil((time()-$timestamp)/120);


Ensuite, on inscrit le nouveau timestamp, qui est en fait l'ancien + $nbX120:

Code :
  1. fputs($read,$timestamp+($nb*120));


Cela vous semble correct ?


Message édité par Zorro561 le 05-06-2007 à 16:58:05
Reply

Marsh Posté le 05-06-2007 à 17:17:55    

De toute façon t'aurais beau faire un script, c'est pas ca qui te fera la mise à jour régulièrement. Il te faut un cron. Il y a des sites qui le font très bien et gratuitement.
 
Tu peux toujours prier pour qu'un visiteur passe le dimanche pour faire ta mise à jour mais c'est pas ce qu'il y a de plus efficace.


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 05-06-2007 à 17:24:49    

Non mais ça ira, là je bosse pour qu'il décale d'une semaine si un visiteur passe le lundi par exemple. Je persiste à penser que le cron pour ce genre de trucs c'est de la connerie. En plus si un visiteur y accède ça met à jour  à un moment différent du cron donc...

Reply

Marsh Posté le 05-06-2007 à 17:28:46    

Comme tu voudras. C'est toi le chef de ton projet.


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 06-06-2007 à 11:05:18    

Bah c'est pas compliqué pourtant :o
 
Dans ton fichier tu fous un timestamp de dimanche.
 
Si l'user passe 1 semaine après, disons un mardi, pourquoi tu veux mettre le timestamp du mardi ? Tu récupères le timestamp de ton fichier et tu lui ajoute 1 ou 2 semaines (ou plus) suivant le cas ... donc ça sera toujours un dimanche dans ton fichier :o


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 06-06-2007 à 12:33:26    

T'as le droit de penser ce que tu veux Zorro561, y compris qu'on dit des conneries, mais n'empêche que cron c'est fait exactement pour ça. Tu trouves vraiment que mettre une ligne dans une crontab c'est plus lourd que de passer la journée à bricoler un truc bancal en PHP ?

Reply

Marsh Posté le 06-06-2007 à 12:50:15    

Nan mais le truc c'est que mon script est tout con, et que j'aimerais éviter de passer par la case cron. En plus j'ai envie de coder mon propre truc pour m'entraîner.
Dj Yell: ouais j'avais saisi le truc, fallait juste bien l'élaborer.

Reply

Marsh Posté le 06-06-2007 à 13:06:21    

Question con : est ce que c'est génant si ce fameux traitement n'est lancé qu'une ou deux fois par an? (bref, s'il se passe plus de 2 semaines entiére sans qu'il soit exécuté)

Reply

Marsh Posté le 06-06-2007 à 13:06:21   

Reply

Marsh Posté le 06-06-2007 à 15:09:41    

Non aucun. Enfin tu parle du cron ou du script a Zorro ?


Message édité par AlphaZone le 06-06-2007 à 15:10:07

---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 06-06-2007 à 15:13:58    

Je parle évidement du script à zorro.

Reply

Marsh Posté le 06-06-2007 à 15:51:04    

Hum non, je crois avoir bien codé le truc pour qu'il gère ça.
Il décale automatiquement:

Code :
  1. <?php
  2. $intervalle = 20; // Intervalle de mise-à-jour (s)
  3. $read = fopen("lastcheck.txt","r" );
  4. $timestamp = fread($read, filesize("lastcheck.txt" ));
  5. fclose($read);
  6. if(time()-$timestamp>=$intervalle)
  7. {
  8. $nb = time()-$timestamp;
  9. $nb = $nb/$intervalle;
  10. if(is_int($nb))
  11.  $nb++;
  12. else
  13.  $nb = ceil($nb);
  14. $new_timestamp = ($nb*$intervalle) + $timestamp;
  15. echo 'L\'heure limite est passée - Inscription du nouveau timestamp (' . date('H:i',$new_timestamp) . ')';
  16. $read = fopen("lastcheck.txt","r+" );
  17. fseek($read,0);
  18. fputs($read,$new_timestamp);
  19. fclose($read);
  20. }
  21. else
  22. {
  23. echo 'L\'heure limite n\'est pas passée';
  24. }
  25. ?>

Reply

Marsh Posté le 06-06-2007 à 15:53:39    

C'est mal codé, tu vérifie même pas si l'ouverture du fichier s'est bien déroulé. Mouahahahaha :D


Message édité par AlphaZone le 06-06-2007 à 15:53:51

---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 06-06-2007 à 15:55:08    

Bah oui, c'est qu'on début, j'ai vérifié que le truc marchait, ensuite vient l'optimisation.

Reply

Marsh Posté le 06-06-2007 à 16:21:50    

Comme ça c'est déjà mieux ?

Code :
  1. <?php
  2. $intervalle = 20; // Intervalle de mise-à-jour (s)
  3. $read = @fopen("lastcheck.txt","r" );
  4. if(!$read)
  5. {
  6. exit('Le fichier n\'est pas accessible');
  7. }
  8. $timestamp = fread($read, filesize("lastcheck.txt" ));
  9. fclose($read);
  10. if(time()-$timestamp>=$intervalle)
  11. {
  12. $nb = time()-$timestamp;
  13. $nb = $nb/$intervalle;
  14. if(is_int($nb))
  15.  $nb++;
  16. else
  17.  $nb = ceil($nb);
  18. $new_timestamp = ($nb*$intervalle) + $timestamp;
  19. echo 'L\'heure limite est passée - Inscription du nouveau timestamp (' . date('H:i',$new_timestamp) . ')';
  20. $read = @fopen("lastcheck.txt","r+" );
  21. if(!$read)
  22. {
  23.  exit('Le fichier n\'est pas accessible');
  24. }
  25. fseek($read,0);
  26. fputs($read,$new_timestamp);
  27. fclose($read);
  28. }
  29. else
  30. {
  31. echo 'L\'heure limite n\'est pas passée';
  32. }
  33. ?>


Message édité par Zorro561 le 06-06-2007 à 17:39:19
Reply

Marsh Posté le 06-06-2007 à 16:33:15    

presque! T'as oublié la ligne 23 :D


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 06-06-2007 à 17:38:30    

En effet, mais je suis parti du principe que si le script continue à s'éxécuter, c'est que le fichier est accessible et que je n'ai pas à re-vérifier, étant donné que la page s'éxécute en moins d'une seconde, si au début du script il est accessible, à la fin il le sera aussi.
Enfin mieux vaut prévenir que guérir, je l'ai rajouté ;).

Reply

Marsh Posté le 06-06-2007 à 18:02:35    

Zorro561 a écrit :

Enfin mieux vaut prévenir que guérir


Surtout dans l'informatique. On n'est pas à l'abri d'un foutu plantage à la noix.
 
Question :
Pourquoi ouvrir 2 fois le même fichier alors qu'une seule ouverture suffirait ?


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 06-06-2007 à 18:06:11    

Hum je sais pas, j'ai peut-être pensé que ça buguerait (j'avais rajouté pas mal de code pour le debug). T'as raison, je pourrais virer le fclose du début.

Reply

Marsh Posté le 06-06-2007 à 18:08:51    

Tu peux mettre ton fclose() en dehors de tes conditions, dès que tu ne t'en sers plus. Vala.


---------------
"Nous avons tous nos machines du temps. Celles qui nous ramènent en arrière sont les souvenirs, celles qui nous projettent en avant sont les rêves."
Reply

Marsh Posté le 06-06-2007 à 21:09:24    

Ouais t'as raison, sinon le code est propre ?

Reply

Marsh Posté le 07-06-2007 à 13:43:50    

Je viens de me rendre compte que l'arrondi du nombre doit se faire à l'entier inférieur et non à l'entier supérieur. Si celui-ci est un entier on ne le change pas.


Message édité par Zorro561 le 07-06-2007 à 13:50:14
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed