Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/04/2008, 14h41   #1
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
Par défaut [Sécurité] Progress bar en ajax : problème de session_start

Bonjour à tous !

Bon je me suis pris la tête une journée sur ce problème (déjà parce qu'au début je ne comprenais pas d'où ça venait).
J'ai une page qui appelle en ajax un script (disons "script1") TRES LONG (genre 10min facile). J'avais donc pensé à l'idée d'une sorte de progress bar en ajax qui permettrait à l'utilisateur de savoir où en est le traitement de la migration des données.
Pour cela, dans script1 je mets à jours des variables en session, et je les récupère dans le "script2" que j'appelle toutes les secondes (donc plusieurs ajax en même temps).

Le souci c'est que bien sûr j'ai fait un ptit session_start() dans chaque script, mais dans le 2ème ça foire. Jme suis dit (au bout d'un long moment de réflexion ) "ok, la session doit déjà être démarrée, donc je vire l'appel à session_start() mais je garde mes appels à $_SESSION['progressbar_curval'] (entre autres).

Seul souci, ces valeurs ne sont pas définies (alors qu'elles le sont, enfin bref), donc souci de session... Sauf que j'ai pas le droit de lancer session_start().

Ma solution (temporaire je l'espère !!!) est d'écrire les variables dans un fichier dans script1, et lire ce fichier dans script2 (j'espère que les "protections" de lecture se font toutes seules, car je n'en prends aucune !)

Quelqu'un aurait-il la solution pour bénéficier de ces variables sans passer par un fichier ? (j'avais pensé à un tableau encore plus "global" que $_SESSION, mais pas trouvé).

Je suis en PHP 4.4 je crois.

Merci à vous
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2008, 08h44   #2
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
Up !

Après plusieurs recherches j'ai trouvé qu'il était possible de modifier le gestionnaire de sessions de PHP.... 5 ! Donc inutile dans mon cas.

En gros 3 solutions :
- soit j'arrive à faire marcher le $_SESSION (mmmh gros doutes)
- soit j'utilise un fichier en espérant qu'il ne puisse pas y avoir de pb de lecture/écriture (genre pile au moment où je le vide pour le récrire dans script1, ben paf! je le lis dans script2 )
- soit j'utilise la base de données (je sais même pas si je gagnerais en temps d'exécution et en sécurité, mais ça ferait des requêtes supplémentaires pour pas grand chose)

Merci de votre aide
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2008, 09h53   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 11
Points : 11
Points : 11
Salut,

J'ai jamais essayer de faire se genre de chose mais c'est assez interressant.

Je pense que ton idée avec les sessions devrait marcher mais la encore je ne peut rien dire dessus sans le code.

Par contre sur les deux autres solutions : c'est clair qu'il vaut mieux utiliser la base : c'est plus rapide et vu le genre de script c'est important.
Loki Circe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2008, 10h01   #4
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
Nan sessions j'arrive pas à les faire marcher correctement ! (et j'attends qu'un gourou de PHP donne des idées :p )

Oui je vais ptet essayer la base pour voir, en espérant que ça ralentisse pas trop le process.
D'ailleurs la base ou le fichier ça part en vrille si ya plusieurs personnes qui utilisent la progress bar en même temps tiens, j'y avais pas pensé !
Nan faudrait vraiment arriver à faire marcher les sessions... Ou alors utiliser un unique id par fichier/record de base si on utilise l'une ou l'autre de ces méthodes alternatives.

Gourous de PHP, pliz help
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2008, 15h49   #5
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
Bon, toujours solution temporaire : j'utilise les fichiers, dont le nom contient le session_id() fourni depuis la page HTML de "départ".

J'ai retenté d'appeler session_start() dans les deux fichiers PHP appelés en Ajax, mais rien à faire, le script2 (celui qui est rapide, lancé toutes les secondes, et qui retourne la valeur courante de la progress bar) attend bêtement que le script1 ait finit pour retourner

Besoin d'un coup de main des roxxor PHP sur ce coup-là
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2008, 16h22   #6
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Salut,

J'ai fait quelques test avec les sessions (d'habitude j'utilise la db pour ça)

Alors ma conclusion est la suivante (si qqn peut confirmer c'est mieux)

Lorsque deux requêtes provenant d'un même client appellent deux pages
php différentes avec toute deux un session_start, la deuxième requête
attendra que la permière aie terminé.

Alors j'ai tenté le session_write_close() qui permet de sauver et fermer
la session, il faut ensuite la rouvrir pour pouvoir à nouveau modifier, voici mon
test:

long.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
	session_start();
	$_SESSION['progress'] = 0;
	session_write_close();
 
	for($i=0;$i<50;$i++) {
		sleep(1);
		session_start();
		$_SESSION['progress']++;
		session_write_close();
	}
 
	echo 'done';
court.php
Code :
1
2
3
4
5
6
 
	session_start();
 
	echo $_SESSION['progress'];
	echo "<br />";
	echo time();
J'ai pu faire une observation qu'il faudrait confirmer:

Si la requête sur court.php survient quand la session est ouverte
sur long.php j'ai peur qu'il y aie un temps de réponse particulièrement
plus long (c'était peut-être un lag sur mon serveur durant mon test)
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 10h24   #7
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
Ah, merci pour la réponse Marchal !

Alors oui en effet j'avais trouvé sur un site un exemple de session_write_close(), mais le truc c'est que ce que je comptais faire, c'est faire un peu comme tu fais toi, mais avec une sécurité supplémentaire qui justement aurait permis de bypasser le problème auquel tu fais allusion.

Genre partout où toi tu mets session_start(), je voulais mettre un truc du genre :
Code :
1
2
3
4
5
6
7
8
 
function my_session_start()
{
   // Eventuellement mettre une sécurité sur un nombre max d'itérations
   while (is_session_open()) // Oui ça n'existe pas et c'est là que ça coince
      usleep(10);
   session_start();
}
Voilà, mais donc je ne savais pas comment faire "is_session_open". Quelque part il était marqué "si vous mettez une variable dans $_SESSION et que ENSUITE vous appelez session_start(), si la variable est toujours là c'est que la session était déjà ouverte" enfin un truc du genre. Bref ça m'aidait pas car il fallait lancer session_start() pour le voir

Donc ta technique est bonne, il faudrait juste trouver un moyen d'écrire cette fonction is_session_open()

Si vous avez une idée....
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 10h30   #8
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Salut,

Tu peux utiliser des gestionnaires de session qui travaillent avec une
base de donnée. Ainsi, pour savoir si la session est ouverte il s'agit
d'une bête requête à la db.
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 11h01   #9
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
Hello ami Suisse !

Ouais mais mon but c'est limiter au maximum de m'acharner sur la DB (d'où ma préférence de l'utilisation des sessions plutôt que mettre ces variables en DB)
Il doit forcément y avoir un autre moyen de savoir si la session est ouverte non ? Je sais pas, un fichier dans /tmp (jdis une bêtise mais dans l'idée on se comprend), ou un test sur une variable "globale", ou.... ?
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 11h12   #10
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Salut,

Oui, la présence du cookie de session et l'existance du fichier correspondant
http://fr.php.net/manual/fr/function...-save-path.php

Mais le problème c'est que la session peut exister en tant que fichier mais
être échue (avant le nettoyage des sessions échues).

Sauf erreur, le fichier de session est un hash sérialisé que tu peux lire toi même
mais l'avantage du mécanisme de session est justement d'éviter que deux
requêtes n'y accèdent en même temps. Si tu contourne ça alors autant revenir
à ton idée de départ pour travailler avec un simple fichier en gérant
toi même le vérouillage
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 12h48   #11
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
Merci pour cette réponse !

Je vais considérer le sujet comme résolu, car suffisamment d'options ont été listées.

Merci de ton aide, à bientôt !
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h37.


 
 
 
 
Partenaires

Hébergement Web