Savoir quand une fonction a été appelé pour la derniere fois

Savoir quand une fonction a été appelé pour la derniere fois - PHP - Programmation

Marsh Posté le 08-04-2005 à 10:15:13    

bonjour,
 
j'aimerait executer le contenu d'une fonction uniquement si elle a pas été appelé depuis x secs.
 
j'ai donc pensé a utiliser une variable static mais on ne peux pas faire ce genre de chose:
 
 
static $lastCall=time();
 
vous voyez comment je peux faire pour résoudre mon probleme ?
 
en evitant d'avoir a passé par une BDD.
 
Merci

Reply

Marsh Posté le 08-04-2005 à 10:15:13   

Reply

Marsh Posté le 08-04-2005 à 10:17:00    

Tu déclare ta variable comme ça, à l'arrache, et dans une fonction t'y fait référence via le tableau $GLOBALS

Reply

Marsh Posté le 08-04-2005 à 10:17:31    

Code :
  1. static $lastCall;
  2. if(!isset($lastCall)) { // Premier appel
  3.     $lastCall=time();
  4. } else { // Appels suivants
  5. }

Reply

Marsh Posté le 08-04-2005 à 10:18:16    

FlorentG a écrit :

Tu déclare ta variable comme ça, à l'arrache, et dans une fonction t'y fait référence via le tableau $GLOBALS


T'as une solution encore plus crade ?  :whistle:

Reply

Marsh Posté le 08-04-2005 à 10:26:47    

Je verrais bien une classe pour faire ça...avec un tableau associatif contenant le nom de la fonction et la date, et des fonctions register()/unregister()/notify()...:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 08-04-2005 à 10:34:13    

ratibus a écrit :

T'as une solution encore plus crade ?  :whistle:


En même temps c'est du PHP, hein :D

Reply

Marsh Posté le 08-04-2005 à 10:39:00    

ratibus a écrit :

Code :
  1. static $lastCall;
  2. if(!isset($lastCall)) { // Premier appel
  3.     $lastCall=time();
  4. } else { // Appels suivants
  5. }



 
salut,
 
je viens d'essayer et il considere toujours $lastCall comme non initialisé, la partie " du else est jamais executé :/
 
 
skeye>>je vais regarder dans la doc, j'ai jamais fait ce genre de chose.
 
tu peux te passer de static avec ta solution ?
 
Thanx :jap:


Message édité par veryfree le 08-04-2005 à 10:42:28
Reply

Marsh Posté le 08-04-2005 à 10:44:52    

veryfree a écrit :

skeye>>je vais regarder dans la doc, j'ai jamais fait ce genre de chose.
 
Si t as un petit exemple en attendant :D  
 
Thanx :jap:


 
Bah un truc con...dans la fonction register() tu crées une ligne pour la fonction dans ton tableau associatif, et dans le corps des fonctions enregistrées tu colles un appel à notify() à la fin, qui mettra à jour la date...:D
 
Bon, c'est pas encore ce qui se fait de plus joli hein...ça t'oblige toujours à avoir une instance de ton objet accessible partout...[:joce]
Ou alors tu raffines encore, et ta fonction à observer est un membre d'un objet qui contient une liste d'objets à notifier...[:ddr555]
 
...et d'ailleurs c'est dans cet objet-là que se trouveraientt la fonction register et unregister...[:joce]


Message édité par skeye le 08-04-2005 à 10:46:12

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 08-04-2005 à 10:51:50    

:sweat:  
faut savoir que cette fonction sera appelée plusieurs fois par sec en cas d'incident et si c'est trop lourd ca pourrais faire tomber nos serveurs :(
 
jprefererai bricoler avec un static moi  [:mmmfff]  

Reply

Marsh Posté le 08-04-2005 à 11:02:29    

veryfree a écrit :

:sweat:  
faut savoir que cette fonction sera appelée plusieurs fois par sec en cas d'incident et si c'est trop lourd ca pourrais faire tomber nos serveurs :(
 
jprefererai bricoler avec un static moi  [:mmmfff]


bah bricole, hein, c'était juste pour faire mumuse hein...;)


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 08-04-2005 à 11:02:29   

Reply

Marsh Posté le 08-04-2005 à 11:07:32    

Chez moi ça marche ceci :

Code :
  1. <?php
  2. function test() {
  3. static $lastCall; 
  4.    
  5.     if(!isset($lastCall)) { // Premier appel
  6.         $lastCall=time();
  7.         echo "Premier appel ($lastCall)";
  8.     } else { // Appels suivants
  9.      echo "Appel suivant ($lastCall)";
  10.     }
  11. }
  12. test();
  13. test();
  14. ?>


 
J'utilise cette méthode pour mon design pattern Singleton en PHP4 ;)


Message édité par ratibus le 08-04-2005 à 11:09:22
Reply

Marsh Posté le 08-04-2005 à 14:17:38    

En fait, je pensait qu'avec une variable static, tout les clients qui consultent la page en question partageai sa valeur.
 
ratibus>> la si on actualise, lastCall est reinitialisé...
 
en fait je vous explique le probleme ce sera plus simple:
 
j'ai une fonction alert appelé lorsqu'il y a une erreur d'execution dans nos scripts.
cele ci envois un mail.
Pour eviter d'envoyer des milliers de mails pour la meme erreur, je verifie qu'aucun mails d'alerte n'a été envoyé dans les 5 dernieres minutes, si c'est le cas, j'ignore l'alerte.
 
Ce systeme n'a pas été developpé par moi  et acutellement on recois jusqu'a 3000 mails sur la journée et ca plombe nos serveurs quoi :/
 
j'espere que c'est plus clair :/


Message édité par veryfree le 08-04-2005 à 14:18:29
Reply

Marsh Posté le 08-04-2005 à 14:18:51    

veryfree a écrit :

En fait, je pensait qu'avec une variable static, tout les clients qui consultent la page en question partageai sa valeur.
 
en fait je vous explique le probleme ce sera plus simple:
 
j'ai une fonction alert appelé lorsqu'il y a une erreur d'execution dans nos scripts.
cele ci envois un mail.
Pour eviter d'envoyer des milliers de mails pour la meme erreur, je verifie qu'aucun mails d'alerte n'a été envoyé dans les 5 dernieres minutes, si c'est le cas, j'ignore l'alerte.
 
Ce systeme n'a pas été developpé par moi  et acutellement on recois jusqu'a 3000 mails sur la journée et ca plombe nos serveurs quoi :/
 
j'espere que c'est plus clair :/


 
à l'envoi du mail stocke la date dans une table à la con dans ta base de données et vérifie avant chaque envoi? :??:


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 08-04-2005 à 14:53:02    

le probleme c'est que la base peut etre inaccessible au moment ou cette fonction est appelé.
C'est bien la son role en fait, envoyé un mail a l'admin quand mysql repond plus [:ddr555]
 
 
je crois que je vais passer par un fichier en fait ;)

Reply

Marsh Posté le 08-04-2005 à 14:53:34    

Voilà, j'allais proposer un beau fichier :)

Reply

Marsh Posté le 08-04-2005 à 15:09:46    

+1 pour le fichier

Reply

Marsh Posté le 08-04-2005 à 16:24:42    

[:volta]

Reply

Marsh Posté le 11-04-2005 à 09:50:21    

juste une petite precision avant de mettre ca en ligne.
 
imaginons que la page est appelé 15 fois sur la meme sec.
il se passe quoi avec le fopen ?
y a un acces synchronisé dessus ?
 
voila la fonction :

Code :
  1. function canSend($min){
  2.  if(!$fp=@fopen('file.txt', 'r+')){
  3.   return true;
  4.  }
  5.  $lastCall=fgets($fp, 1024);
  6.  if(time()-$lastCall>($min*60)){
  7.   fseek($fp, 0);
  8.   fputs($fp, time());
  9.   $sendOk=true;
  10.  }else{
  11.   $sendOk=false;
  12.  }
  13.  fclose($fp);
  14. return $sendOk;
  15. }


Message édité par veryfree le 11-04-2005 à 09:50:43
Reply

Marsh Posté le 11-04-2005 à 12:11:45    

flock :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 11-04-2005 à 13:48:51    

o_O

Reply

Sujets relatifs:

Leave a Replay

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