probleme de timer

Petit nouveau ! | 3 Messages

26 avr. 2007, 01:07

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]'";

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

26 avr. 2007, 02:11

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]
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 3 Messages

26 avr. 2007, 09:50

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);
		}
	}
}

Mammouth du PHP | 505 Messages

26 avr. 2007, 14:54

: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.

ViPHP
ViPHP | 5924 Messages

26 avr. 2007, 14:57

Ah oui, c'est magnifique ca. Ce genre d'application, ca se fait avec des binaires, pas avec php...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 avr. 2007, 15:56

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer