Page 1 sur 1

probleme de timer

Posté : 26 avr. 2007, 01:07
par papis
bonjour j'ai un probleme avec un script qui utilise un timer avec sleep mais le probleme c ke l'action n'est effecté que si le delai est dépassé est ce ke kelkun peut me donner une autre methode pour resoudre ce probleme
voici le code en question
$query2 = "UPDATE UTILISATEURS SET ETAT='trimestre' WHERE MAIL='[email protected]'";
$trimestre =7889231.49 ;
sleep($trimestre);
$query2 = "UPDATE UTILISATEURS SET ETAT='inscrit' WHERE MAIL='[email protected]'";

Posté : 26 avr. 2007, 02:11
par @rthur
Bonjour,

Que veux-tu faire exactement?
De plus, afin de simplifier la lecture des membres de PHPfrance qui lisent tes messages, merci:
- de soigner l'orthographe
- d'utiliser les balises PHP pour rendre ton code plus facile à lire

Code : Tout sélectionner

[php]...[/php]

Posté : 26 avr. 2007, 09:50
par papis
ben en faite je veut valider un abonnement sur un site payant qui passe l'etat de l'utilisateur de trimestre vers inscrits au bout de trois mois sur ce script et envoye un mail quatre jours avant la fin de l'abonneement pour rapeler l'expiration de l'abonnement mais le probleme je peut pas afficher mon echo 'abonnement valider pas avant la fin du delai mis dans sleep
class Validerabonnement {
	
	public function setEtat3($typeabonnement,$mail){
			
		$trimestre = 7889231.49 ; // 3mois en secondes
		$annuel = 31556926; // 12 mois en secondes
		
		if($typeabonnement =='mensuel'){
			sleep($trimestre);
			$query2 = "UPDATE UTILISATEURS SET ETAT='inscrit' WHERE MAIL='$mail'";
		}
		else if($typeabonnement =='annuel') {
			sleep($annuel);
			$query2 = "UPDATE UTILISATEURS SET ETAT='inscrit' WHERE MAIL='$mail'";
			$result2 = mysql_query($query2);
		}
		
		echo 'abonnement valider ' ;
		
		$delaitrim4 = $trimestre - 345600 ; // 4 jours avant
		$delaian4 = $annuel - 345600 ; // 4 jours avant
		
		if($typeabonnement =='mensuel'){
			sleep($delaitrim4);
			$headers = 'MIME-Version: 1.0' . "\r\n";
			$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
			$headers .= 'To: Webmaster <[email protected]>' . "\r\n";
			$headers = "From: [email protected]\r\n";
			$objet = 'fin abonnement';
			$contenu = 'alerte votre abonnement prend fin dans 4 jours ';
			mail($mail, $objet, $contenu, $headers);
		}
		else if($typeabonnement =='annuel') {
			sleep($delaian4);
			$headers = 'MIME-Version: 1.0' . "\r\n";
			$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
			$headers .= 'To: Webmaster <[email protected]>' . "\r\n";
			$headers = "From: [email protected]\r\n";
			$objet = 'fin abonnement';
			$contenu = 'alerte votre abonnement prend fin dans 4 jours ';
			mail($mail, $objet, $contenu, $headers);
		}
	}
}

Posté : 26 avr. 2007, 14:54
par titerm
:lol: Et tu comptes faires des scripts qui dorment 3 mois voire un an ??? ...

Qu'est ce qu'il se passe si le serveur redémarre ? si apache plante ? ...
Et si le site a du succès et que tu as 5000 abonnée nouveau, tu vas avoir 5000 process apaches ? Le pb, c'est que le nombre de thread est limité, la ram aussi ....
Bref, faut franchement revoir ta conception, ca tient pas du tout debout.

à la rigueur, fais plutot une table avec tes évènement et un cron qui check ta table régulièrement et qui exécute les évènements qui sont a termes.

Posté : 26 avr. 2007, 14:57
par Sékiltoyai
Ah oui, c'est magnifique ca. Ce genre d'application, ca se fait avec des binaires, pas avec php...

Posté : 26 avr. 2007, 15:56
par zeus
D'une manière plus posée et surtout moins moqueuse que mes confrères, je vais t'expliquer en quoi tu utilises la mauvais méthode.

Le principe que tu utilises est qu'a partir d'une action, tu "endors" un script pendant un trimestre pour qu'au réveil, il réalise une action. Cette méthode entraine des problèmes qui ont déjà été soulevés :
- la limite d'exécution de la configuration va tuer tes process avant qu'ils arrivent à terme
- beaucoup de process simultanées
- en cas de chute du serveur, tu perds tous les process en attente.

La méthode qui me semble la plus efficace est la création d'une table qui contiendrais :
  • le membre concerné
  • la date de début de la période d'activité
  • la date de fin de la période d'activité
  • un marqueur permettant de savoir si le membre à été averti que cette période se termine
Tu créés ensuite un script qui s'exécute tout les jours et qui sélectionne toutes les lignes de cette table pour lesquelles la date de fin se trouve dans mois de 4 jours et dont le membre n'a pas encore été averti et, pour chaque enregistrement retourné, envoi un mail d'avertissement.

Du coup :
- Toutes les opérations sont réalisées en même temps
- Pas de process en attente
- Si ton serveur est bloqué pendant plusieurs jours, tu rattrapes quand même le retard automatiquement.