Page 1 sur 1

une liste de connectés avec les sessions php et mysql ?

Posté : 19 sept. 2012, 12:48
par mouffles
Salut à tous,

C'est mon premier sujet donc je me présente au moins un peu, je suis débutant développeur en actionscrip et en php, j'ai déjà fait pas ma l de trucs, mais je suis pas vraiment confirmé, surtout en php.

Donc ma première question concerne un chat inégré dans un minijeux du genre asynchrone avec une liste de connectés, quand je dit asynchrone c'est à dire que chaque client interroge toute les x secondes la bdd pour récupérer les messages.

J'ai un soucis avec la liste de connecté, j'utilisai de l'ajax pour détecter la fermeture ou le rechargement de la page, mais parfois ça bug, parfois ça n'apelle pas le php de déconnection car ça n'en a pas le temps...

Et je suis "presque" certain que ce genre de choses est faisable avec les SESSIONS php, mais je ne maîtrise pas très bien ça.

En gros je me disais qu'à chaque connection d'un client à la bdd, je pourrai utiliser une boucle qui list toute les $_SESSION['pseudo'] ouvertes sur le serveur, mais je ne sais pas du comment je pourrai faire ça, ni si on peux interroger et lister les sessions de cette façon là...

Si quelqu'un à une piste, ça m'aiderait pas mal ^^

Re: une liste de connectés avec les sessions php et mysql ?

Posté : 19 sept. 2012, 13:02
par moogli
salut,


si tu souhaite quelque chose comme le nombre de connecté sur les "x" dernières minutes (comme sur ce forum) c'est relativement simple.

Il faut une table (en relation avec la table membre) dans laquelle tu insère une ligne quand quelqu'un se connecte.
il te reste à faire un count() sur les tuples présents dans la table pour l'afficher.

en gros
create table connected (
idco int not null auto_increment primary key,
idmembre int not null,
dateConnexion datetime not null,
contraint fk_membre foreign key(idmembre) references membres.idmembre
);
par exemple pour mysql

lorsqu'un membre se connecte tu ajoute une ligne avec si id et la date (avec l'heure, tu peux utiliser now() ou current_date en SQL).
lorsqu'un membre fait un requête serveur tu met à jour le champ dateConnexion. (il peux être intéressant de ne pas le faire sur toute les actions pour ne pas surcharger les serveurs).

l'affichage du nombre de connecté est un simple select.

Il te faut prévoir une routine de nettoyage de la table (je pencherais pour une procédure stockée comme ça tu n'a qu'un appel et aucun calcul à faire).
cette procédure supprime tous les tuples qui sont plus vieux que x minutes.
ce nettoyage est a faire avant le count() (sinon le calcul est foireux).

A la limite tu peux tous faire en SQL c'est relativement simple.

@+

Re: une liste de connectés avec les sessions php et mysql ?

Posté : 19 sept. 2012, 13:23
par Mazarini
En fait, il est impossible de connaitre vraiment le nombre de connecté puisque personne n'est vraiment connecté mais juste 'reconnu' à chaque appel au serveur. D'ou tes problèmes avec la déconnexion qui n'est pas toujours prise en compte.

Au mieux tu peux connaitre les personnes s'étant connectées dans les x dernières secondes. C'est d'ailleurs ce qui t'est proposé ci-dessus.

Re: une liste de connectés avec les sessions php et mysql ?

Posté : 19 sept. 2012, 15:43
par mouffles
Merci de vos réponses si rapides !

Ce que tu me proposes moogli c'est ce que je faisais aussi à peu près déjà, sauf que pour les déconnection j'utilisai la requêtes ajax, et toute les n minutes je lançais un cron qui vidait toute la table des connectés, puis à la première requête cliente lancée vers le chat je réinscrivais les membres (j'ai été obligé de faire ça car le comportement de l'ajax était trop erratique).

Sauf que la méthode que tu me proposes, même si elle est moins réactive, est plus souple et moins buggée, en gros je ne gère pas les déconnections coté client, mais uniquement les connections coté serveur, j'efface les connections de plus de x minutes, puis si l'utilisateur est présent la requête php cliente qu'il lance en récupérant le chat le réinscrit sur la liste des connectés.

J'ai pas peur de surcharger mon serveur, je me suis mis à l'admin serveur linux, j'ai été obligé car les jeux multi flash/php/mysql et les sites communautaires sont vraiment éxigeants, il y a les ressources matérielle derrière et j'ai réussi à bien optimiser tout ça.

J'ai juste deux questions :

Qu'est ce qu'un tuples ?
Et qu'est ce qu'une procédure stockée ?

Si ça vous saoul de me répondre je trouverai sûrement moi même plus tard je suis pas si faignéant ;)

Re: une liste de connectés avec les sessions php et mysql ?

Posté : 19 sept. 2012, 16:05
par moogli
un tuple c'est un ligne d'une table

pour ce qui est SQL je te conseil : http://sqlpro.developpez.com/cours/sqlaz/fondements/#L8

Faire ce genre de chose coté client n'est pas fiable,trop contraignant et aléatoire (différent type de navigateur, tu ne sais si l'on bidouille ou pas ton code etc etc).
Le serveur à déjà toutes les infos en stock a lu ide les agencer comme il faut .


pour compléter mon exemple de tout à l'heure, un exemple de proc stock pour le garbage collector et une pour le nombre de connecté.
-- la tables de membres (minimaliste ^^)
create table membres (
	idmembre int unsigned not null auto_increment primary key,
	pseudo varchar(20) not null,
	mdp	blob not null
);
-- les membres connectés
create table connected (
	idco int not null auto_increment primary key,
	idmembre int unsigned not null,
	dateConnexion datetime not null,
	constraint fk_membre foreign key (idmembre) references membres(idmembre)
);

-- le nombre de gens connecté 
delimiter $$

create procedure nbConnected(out nb integer)
begin 
	select count(*) into nb from connected;
end$$

delimiter ;

-- garbage collector table connected

delimiter $$

create procedure cleanConnected 
	(
	in duree integer
	)
	begin
		declare dureezero CONDITION for SQLSTATE '23000';
		DECLARE EXIT HANDLER FOR dureezero SET @error = 'la durée doit être non null et supérieure à zéro !'; 
		
		if duree is null or duree = 0 then
			signal dureezero;
		else
			delete from connected where dateConnexion < subdate(now(), interval duree minute );
		end if;
	end$$

delimiter ;
utilisation ?

très simple (en SQL)
call nbConnected(@out);
select @out;

-- pour le gc
call cleanConnected(5); -- pour 5 minutes, a toi d'adapter le temps
 
Il est possible de faire la même chose pour le reste, mais la le plus important c'est le GC. tu peux très bien le lancer avec un cron, ou l'utiliser a chaque demande de page web.


@+

Re: une liste de connectés avec les sessions php et mysql ?

Posté : 19 sept. 2012, 16:15
par nhachet
Bonjour,

l'autre solution consiste à gérer les sessions PHP via la base de données (par défaut elles sont écrites sur disque). Il existe de nombreux exemples sur le Web. Une fois gérées via la BDD, il suffit de faire un SELECT sur la table stockant les sessions selon la même méthode que moogli.

Re: une liste de connectés avec les sessions php et mysql ?

Posté : 19 sept. 2012, 16:40
par mouffles
C'est ce que je comptais faire au début les SESSIONS, cela dit gérer ça qu'avec mysql me semble moins erratique, les sessions à chaque fois j'ai plus de soucis avec.

Merci à vous trois, je vais potasser ce que tu m'as donné en exemple moogli je repasse si je galère mais ça devrait aller ^^

Re: une liste de connectés avec les sessions php et mysql ?

Posté : 19 sept. 2012, 21:53
par moogli
pour compléter la réponse de nhachet voici un exemple fait par stealth35 avec sqlite vos-contributions/gerer-les-sessions-av ... 56150.html



@+