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

JavaScript Discussion :

[AJAX] multithreads et sessions PHP ne font pas bon m�nage !


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2006
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activit� : Chef de projet MOA

    Informations forums :
    Inscription : Octobre 2006
    Messages : 23
    Par d�faut [AJAX] multithreads et sessions PHP ne font pas bon m�nage !
    Bonjour, bonjour, bonjour tout le monde !!

    Voil�, je viens vous parler d'un probl�me que je rencontre actuellement avec AJAX multithreads (mode asynchrone en fait).

    Voici ce qui se passe:
    Des �l�ments de mon site envoient plusieurs requ�tes XMLHTTPRequests en parall�le, vers un m�me script PHP qui r�cup�re les variables de session de l'utilisateur courant. Il arrive de temps � autre que la fonction "session_start" plante car elle n'a pas le droit d'ouvrir le cookie de session... car il y a un lock dessus :-(

    Donc, j'imagine que ce probl�me survient quand 1 session_start survient trop rapidement apr�s un autre session_start pour le m�me utilisateur.

    Du coup, j'ai le sentiment que le mariage AJAX et sessions PHP ne font pas bon m�nage. Est-ce que je me trompe ? Est-ce que quelqu'un a d�j� eu ce probl�me ? L'a-t-il r�solu ? Voici quelques questions que je me pose.

    Je n'ai rien trouv� sur ce sujet... alors si quelqu'un a d�j� rencontr� ce probl�me, qu'il n'h�site pas � partager ses griefs avec moi ;-), Et s'il a trouv� une solution: MERCI de m'en faire part !!


    Merci en tout cas de m'avoir lu ;-)

  2. #2
    Membre �prouv�
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    D�tails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Par d�faut
    >Donc, j'imagine que ce probl�me survient quand 1 session_start survient trop rapidement apr�s un autre session_start pour le m�me utilisateur.

    c'est �a, php lock les sessions et le probl�me existe �galement avec les frames.

    ce qui m'�tonne c'est que tu dises que �a plante, l'exp�rience que j'en ai serait plut�t que php attend sagement que la session se lib�re (php5.x), ajax ou pas ajax.

    pour am�liorer les choses il est possible de lib�rer la session d�s que tu as fini de la manipuler plut�t que d'attendre la fin du script :

    http://fr2.php.net/manual/fr/functio...rite-close.php

    ce type de probl�me avec les frames :
    http://fr3.php.net/manual/fr/functio...tart.php#70235

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2006
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activit� : Chef de projet MOA

    Informations forums :
    Inscription : Octobre 2006
    Messages : 23
    Par d�faut
    Et bien en fait, en terme de plantage, �a n'est pas exactement �a... c'est plut�t que mon script continue, mais sans les variables de sessions, du coup... j'ai des warning d'acc�s � des m�thodes d'objet qui ne sont pas des objets, etc. ;-)

    En tout cas, merci beaucoup pour ce tuyau, j'vais voir si �a r�tablit les choses ;-)

    Je te tiendrai au courant, si tu veux ^^

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2006
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activit� : Chef de projet MOA

    Informations forums :
    Inscription : Octobre 2006
    Messages : 23
    Par d�faut
    Bon, alors en d�finitive, session_write_close ne r�soud pas compl�tement mon probl�me, m�me s'il l'a �norm�ment am�lior�.
    Tout ceci vient du fait que le script qui pose probl�me fait un session_start, r�cup�re l'objet "Site Internet", puis, g�re la requ�te de l'utilisateur, retourne le r�sultat, puis.... l'objet est � nouveau sauvegard� dans les variables de session. Donc forc�ment, je ne peux pas faire un session_write_close avant la fin du traitement, qui malheureusement peut prendre un peu de temps.

    Du coup, voici comment j'ai r�solu TOTALEMENT mon probl�me:

    une table sessions (session_id, session_status) dans la base de donn�e. Le session_id est stock� d�sormais dans mon objet site et toute requ�te construite depuis l'interface client, envoie ce fameux session_id au script serveur. Du coup, je peux r�cup�rer le statut du cookie stock� dans la base de donn�e.
    S'il est "locked", alors je fais une boucle qui fait patienter le script 500ms avant de rev�rifier si le lock a �t� lib�r� (toujours dans la base de donn�es).

    C'est une solution qui ralentit quelque peu les traitements, c'est certain, mais qui au moins, � le m�rite de ne jamais planter. De plus, si jamais votre base de donn�es est inaccessible (serveur down)... on peut g�rer le probl�me sans soucis et avertir l'utilisateur que le serveur ne semble pas r�pondre. Il faut bien penser aussi � ne pas boucler ind�finiment, et pr�voir une sortie avec message d'erreur �galement.

    Voici le code utilis�:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    require_once("../functions.inc.php");
    //Début de l'inclusion de toutes les classes nécessaires avant le début de la session
    require_once("../config.inc.php");
    $classes_dir = getAbsolutePath()."classes";
    if(is_dir($classes_dir))
    {
    	$dh= opendir($classes_dir);
    	while ($fichier = readdir ($dh))
    	{
    	    if ($fichier != "." && $fichier != ".." && !is_dir($fichier) && stripos($fichier, ".class.php") > 0)
    		{
     
    	        require_once(getAbsolutePath()."classes/".$fichier);
    	    }
    	}
    	closedir ($dh);
    }
    else
    {
     
    }
    //fin de l'inclusion des fichiers .class.php
     
    //Récupération des paramètres de la requête utilisateur
    $object = $_POST["object"];
    $id     = $_POST["id"];
    $invoke = $_POST["invoke"];
    $params = $_POST["params"];
    $session_id = $_POST["session_id"];
     
     
    //début du traitement du script avec gestion du lock de session
    if($session_id != "")
    {
    	dbConnect();
    	$query = "select session_id, session_status from sessions where session_id = '".$session_id."'";
    	$resId = runQuery($query);
    	$resCount = resCount($resId);
    	if($resCount > 0)
    	{
    		$session = moveNext($resId);
    		if($session["session_status"] == "locked")
    		{
    			$query = "select session_id, session_status from sessions where session_id = '".$session_id."'";
    			while($resCount > 0 && $session["session_status"] == "locked")
    			{
    				usleep(500);
    				$resId = runQuery($query);
    				$resCount = resCount($resId);
    				if($resCount > 0)
    				{
    					$session = moveNext($resId);
    				}
    			}
    		}
    		$query = "update sessions set session_status='locked' where session_id='".$session_id."'";
    	}
    	else
    	{
    		$query = "insert into sessions (session_id, session_status) values ('".$session_id."', 'locked')";
    	}
    	runQuery($query);
    	session_start();
    	$internetSite = $_SESSION["site"];
     
    	echo $internetSite->updateSite($object, $id, $invoke, $params);
    	$_SESSION["site"] = $internetSite;
    	session_write_close();
    	$query = "update sessions set session_status='unlocked' where session_id='".$session_id."'";
    	runQuery($query);
    }
    Je n'ai pas fini le script... mais dans l'id�e, �a sera �a que j'utiliserai...

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    D�tails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Par d�faut
    >Et bien en fait, en terme de plantage, �a n'est pas exactement �a... c'est plut�t que mon script continue, mais sans les variables de sessions, du coup... j'ai des warning d'acc�s � des m�thodes d'objet qui ne sont pas des objets, etc.

    bizarre, je n'ai pas du tout ce comportement, le script bloque � session_start() et attend.

    mais dit moi si je me trompe.
    ta solution revient � effectuer des requ�tes synchrones vu que tu vas traiter un script avant d'en entamer un second.

    si c'est le cas il existe la solution d'un pool de requ�te ajax � mettre en place c�t� client et qui me semble un peu plus simple.
    l'id�e serait de mettre en attente une requ�te tant que la pr�c�dente n'est pas termin�e.

    sinon il existe aussi une autre m�thode pour traiter les sessions qui ne produit aucun lock (donc � chacun de g�rer les probl�mes d'int�grit�), mais necessite la compilation de php avec "with-mm=DIR" (elles seront g�r�es en m�moire partag�e) :

    http://www.zend.com/tips/tips.php?id=164&single=1

    +

  6. #6
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2006
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activit� : Chef de projet MOA

    Informations forums :
    Inscription : Octobre 2006
    Messages : 23
    Par d�faut
    Oui, en effet, c'est quasiment du synchrone, sauf si lors de mon script, je lib�re la session avant la fin de l'�x�cution totale du script en cours. On pourrait tr�s bien imaginer que dans mon script, que je r�cup�re l'objet Site Internet, que j'appelle les diff�rentes m�thodes qui conviennent, que je sauvegarde l'objet, lib�re la session et continue de faire d'autres traitement de pr�sentation ou que sais-je... du coup, mon script 1 n'est pourtant toujours pas termin� que mon script 2 peut n�anmoins d�buter.

    Autre diff�rence avec le mode synchrone de l'objet XMLHTTRequest, ce dernier bloque le navigateur c�t� client tant qu'il n'a pas re�u la notification de fin de traitement c�t� serveur.... emp�chant alors toute navigation.... �a a souvent tendance � freezer le navigateur, ce qui est � proscrire. Quitte � empiler des actions dans un stack quelconque, j'p�f�re autant que �a se fasse c�t� serveur.

    Maintenant, je reste n�anmoins tout � fait d'accord avec toi sur le fait que OUI, c'est bien du synchrone.

    Merci pour les infos concernant la r�cup�ration partag� des cookies de sessions. Mais malheureusement, puisque mon projet est destin� � �tre h�berg� sur un serveur mutualis� classique... je ne sais pas si je pourrais trouver l'environnement ad�quat qui me permettrait de faire �a.

  7. #7
    Membre �prouv�
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    D�tails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Par d�faut
    Autre diff�rence avec le mode synchrone de l'objet XMLHTTRequest, ce dernier bloque le navigateur c�t� client tant qu'il n'a pas re�u la notification de fin de traitement c�t� serveur.... emp�chant alors toute navigation.... �a a souvent tendance � freezer le navigateur, ce qui est � proscrire. Quitte � empiler des actions dans un stack quelconque, j'p�f�re autant que �a se fasse c�t� serveur.
    ok, mais j'aurais besoin d'explications sur le freeze dont tu parles (si tu veux bien ).

    comme le sujet m'interresse j'ai mis en ligne une d�mo de gestion d'un pool xhr :
    http://fassnet.net/spool/

    c'est simple (trois boutons => trois actions qui correspondent � un sleep de temps diff�rent en php), et j'ai mis en parall�le les demandes et les r�ponses des requ�tes.

    si je pars de la page alors qu'il y a une requ�te en cours, la connection stop (test� gr�ce � l'�criture dans un fichier) et il peut r�sulter une erreur de la part d'xhr.

    pour l'instant le seul reproche que je peux faire � cette m�thode concerne la difficult� de g�rer les tokens de spoof.

    comme je l'ai dit l'exemple est simple, mais je ne vois pas pourquoi il y aurait un freeze de la part du navigateur.

    +

  8. #8
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2006
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activit� : Chef de projet MOA

    Informations forums :
    Inscription : Octobre 2006
    Messages : 23
    Par d�faut
    Attends, j'comprends pas bien ton exemple...

    Est-ce que tu utilises les requ�tes xhr en mode parall�le, avec une gestion d'attente c�t� serveur?

    Utilises-tu des sessions ?


    En fait, lorsque je me suis int�ress� � AJAX la premi�re fois, j'ai tout de suite �t� attir� par ces nouveaux forum en PHP, qui ne n�cessitaient pas de rechargement de la page. C'est typiquement le genre d'application qui illustre bien le c�t� pratique d'envoi d'information vers le serveur et de r�cup�ration d'information sans rechargement d'une page. Seulement, il se trouve que de temps � autre, j'avais des blocages du navigateur. En cherchant un peu, j'me suis rendu compte que toutes les requ�tes xhr �taient g�r�es de fa�on synchrones.... et puis, j'ai chang� �a en asynchrone et l�... je n'avais plus de freeze du tout.

    Enfin, bon... j'suis pas un expert, donc j'me trompe certainement !

  9. #9
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    �tudiant
    Inscrit en
    F�vrier 2006
    Messages
    2 532
    D�tails du profil
    Informations personnelles :
    �ge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 532
    Par d�faut
    J'ai jamais fait de PHP, mais bon :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    $continue=true;
    while ($continue) {
    try {
        session_start();
        $continue=false;
    } catch ($ex) { sleep(100); }
    }

  10. #10
    Membre �prouv�
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    D�tails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Par d�faut
    Est-ce que tu utilises les requ�tes xhr en mode parall�le, avec une gestion d'attente c�t� serveur?
    Utilises-tu des sessions ?
    non pour les deux, la majorit� se passe c�t� client, le serveur envoie juste une cha�ne de caract�res apr�s un sleep().
    je me suis dit que t'avais trouv� une solution � ton probl�me alors j'ai un peu d�vier de la question initial

    j'utilise un tableau c�t� client qui stock les objet xhr au fure � et � mesure pour les envoyer d�s que le pr�c�dent a fini.

    pour les sessions je pourrais les utiliser que �a ne changerais pas grand chose.

    >Enfin, bon... j'suis pas un expert, donc j'me trompe certainement !

    ou tu as certainement raison, alors je cherche � comprendre...


    @fremy
    php n'est pas objet � la base, donc ses fonctions ne retournent pas d'exceptions � part certains objet depuis la v5 .
    session_start ne retourne m�me pas false en cas de lock (mais apparemment cette fonction ne r�agit pas chez moi comme chez tanhys...)

  11. #11
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2006
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activit� : Chef de projet MOA

    Informations forums :
    Inscription : Octobre 2006
    Messages : 23
    Par d�faut
    Citation Envoy� par tthierry
    session_start ne retourne m�me pas false en cas de lock (mais apparemment cette fonction ne r�agit pas chez moi comme chez tanhys...)
    Exactement !! J'suis en V5, et d'ailleurs, dans les docs, ils sp�cifient bien que "session_start" retourne TOUJOUR true, que la fonction ait r�ussi ou non.... ce que je trouve un peu l�ger mais bon... peut-�tre que �a changera avec la V6 ;-)

    Sinon, pour en revenir aux objets xhr... j'utilise aussi un tableau dans lequel je mets toutes mes requ�tes les unes derri�re les autres... �a me permet effectivement de bien traiter, toutes les requ�tes tranquillement !



    Enfin, bon... dans tous les cas, j'dirais ceci: mieux vaut quand m�me �viter les traitements c�t� client... on ne sait jamais ;-)

  12. #12
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    �tudiant
    Inscrit en
    F�vrier 2006
    Messages
    2 532
    D�tails du profil
    Informations personnelles :
    �ge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 532
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    while (!$varDeSession) {
       // ... 
    }

  13. #13
    Membre �prouv�
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    D�tails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Par d�faut
    >J'suis en V5

    tu testerais pas tes scripts sous windows ?

    si c'est le cas est ce que via ton h�bergeur session_start() attend ou passe comme tu l'as d�ja indiqu� ?

  14. #14
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2006
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activit� : Chef de projet MOA

    Informations forums :
    Inscription : Octobre 2006
    Messages : 23
    Par d�faut
    Citation Envoy� par tthierry
    >J'suis en V5

    tu testerais pas tes scripts sous windows ?

    si c'est le cas est ce que via ton h�bergeur session_start() attend ou passe comme tu l'as d�ja indiqu� ?
    Oui, en effet, pour l'instant, je d�veloppe tout �a chez moi, sous Windows ;-)

    Je verrai effectivement si cela passe ou attend chez mon h�bergeur ;-)

Discussions similaires

  1. [DisplayTag] Tri et pagination ne font pas bon m�nage
    Par tiboudchou dans le forum Taglibs
    R�ponses: 4
    Dernier message: 31/03/2010, 12h22
  2. R�ponses: 1
    Dernier message: 20/04/2009, 17h16
  3. C++ et VB6 ne font pas bon m�nage!
    Par Tuizi dans le forum C++
    R�ponses: 6
    Dernier message: 18/07/2008, 10h03
  4. Le wifi et Club Internet ne font pas bon m�nage!
    Par Ylias dans le forum La taverne du Club : Humour et divers
    R�ponses: 5
    Dernier message: 20/08/2007, 10h30
  5. R�ponses: 2
    Dernier message: 12/08/2007, 15h27

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