IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Sécurité] Progress bar en ajax : problème de session_start


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 77
    Points
    77
    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

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 77
    Points
    77
    Par défaut
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    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.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 77
    Points
    77
    Par défaut
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 77
    Points
    77
    Par défaut
    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à

  6. #6
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 77
    Points
    77
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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....

  8. #8
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    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.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 77
    Points
    77
    Par défaut
    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.... ?

  10. #10
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    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

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 77
    Points
    77
    Par défaut
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème actualisation progress bar
    Par saket2114 dans le forum EDT/SwingWorker
    Réponses: 4
    Dernier message: 29/10/2009, 18h42
  2. probléme du composant progress bar
    Par ouadie99 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/03/2008, 14h43
  3. [Patterns]Séparation IHM <-> Noyau : Problême de progress bar ?
    Par Muetdhiver dans le forum Design Patterns
    Réponses: 8
    Dernier message: 18/09/2007, 22h28
  4. Réponses: 26
    Dernier message: 16/08/2007, 16h37
  5. Progress bar problème
    Par neyutran dans le forum MFC
    Réponses: 3
    Dernier message: 03/05/2007, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo