Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Hello,
Version du Framework 1.5.2 (testé aussi avec la version 1.5.0 et avec le dernier Snapshot)
j'obtiens les erreurs suivantes:
Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'You must explicitly start the session with Zend_Session::start() when session options are set to strict.' in /home/webdev/webstage/devintra/framework/library/Zend/Session.php:355 Stack trace: #0 /home/webdev/webstage/devintra/framework/library/Zend/Session/Namespace.php(116): Zend_Session::start(true) #1 /home/webdev/webstage/devintra/framework/library/Zend/Auth/Storage/Session.php(85): Zend_Session_Namespace->__construct('Zend_Auth') #2 /home/webdev/webstage/devintra/framework/library/Zend/Auth.php(92): Zend_Auth_Storage_Session->__construct() #3 /home/webdev/webstage/devintra/framework/library/Zend/Auth.php(134): Zend_Auth->getStorage() #4 /home/webdev/webstage/devintra/ssl/zfweb/prepend.php(70): Zend_Auth->hasIdentity() #5 {main} thrown in /home/webdev/webstage/devintra/framework/library/Zend/Session.php on line 355
lorsque je ne démarre pas la session Zend_Session::start(<avec les options ci-dessous>);
et qu'ensuite je fais un
$authInstance = Zend_Auth::getInstance(); if ($authInstance->hasIdentity()===true){ // -> j'obtiens l'exception dans $authInstance->hasIdentity() } [...]
Donc je vois bien que la session n'est pas démarrée.
les options de mes sessions sont stockées dans un fichier xml et sont les suivantes:
<name>SESSIONNAME</name> <save_path>/tmp/sessionpath/</save_path> <save_handler>files</save_handler> <hash_bits_per_character>5</hash_bits_per_character> <hash_function>0</hash_function>
Quand en revanche je démarre ma session
if (! Zend_Session::isStarted ()) { $sessionConfig = new Zend_Config_Xml ( rtrim ( $appConfig->paths->configs, '/\\' ) . '/session.xml', $bridge->getHostEnvironment() ); Zend_Session::start ( $sessionConfig->toArray () ); } [...] $authInstance = Zend_Auth::getInstance(); if ($authInstance->hasIdentity()===true){ // -> j'obtiens l'exception dans $authInstance->hasIdentity() }
j'obtiens l'exception suivante :
Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'The session was explicitly destroyed during this request, attempting to re-start is not allowed.' in /home/webdev/webstage/devintra/frameworkSnapshot/library/Zend/Session.php:364 Stack trace: #0 /home/webdev/webstage/devintra/frameworkSnapshot/library/Zend/Session/Namespace.php(116): Zend_Session::start(true) #1 /home/webdev/webstage/devintra/frameworkSnapshot/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth') #2 /home/webdev/webstage/devintra/frameworkSnapshot/library/Zend/Auth.php(91): Zend_Auth_Storage_Session->__construct() #3 /home/webdev/webstage/devintra/frameworkSnapshot/library/Zend/Auth.php(133): Zend_Auth->getStorage() #4 /home/webdev/webstage/devintra/ssl/zfweb/prepend.php(70): Zend_Auth->hasIdentity() #5 {main} thrown in /home/webdev/webstage/devintra/frameworkSnapshot/library/Zend/Session.php on line 364
Donc j'ai cherché un peu et dans les version >1.5.0 la fonction start de Zend/Session.php contient
if (self::$_sessionStarted && self::$_destroyed) { require_once 'Zend/Session/Exception.php'; throw new Zend_Session_Exception('The session was explicitly destroyed during this request, attempting to re-start is not allowed.'); } if (self::$_sessionStarted) { return; // already started }
alors que dans la version 1.0.3:
if (self::$_sessionStarted) { return; // already started }
Donc ma question est: comment faire pour démarrer mes sessions sans impacter les authentifications? (ou inversement?)
Merci pour vos réponses !
PsY
Dernière modification par PsY (22-05-2008 12:14:19)
Hors ligne
Bnojur,
as-tu essayer de démarrer ta session avec les parametres par defaut dans un premier temps ?
et de la tester (placer une valeur et la recuperer dans la page d'apres).
meme chose avec tes options
je pense qu'il y a un pb dans tes session (options, droits sur ton repertoire save_path, ....) et que ca n'est pas lié à zend_Auth.
Hors ligne
merci pour ta réponse ichevc02.
Je viens de tester avec simplement
if (! Zend_Session::isStarted ()) { Zend_Session::start ( ); } $authInstance = Zend_Auth::getInstance(); if ($authInstance->hasIdentity()===true) { //stuff }
mais j'ai la même réponse.
'The session was explicitly destroyed during this request, attempting to re-start is not allowed.'
Le problème est que ça fonctionne bien avec la version 1.0.3 du framework.
Pire encore: j'ai ajouté un simple die('destroyed'); en première ligne dans la fonction destroy de Zend/Session.php, et rien ne s'affiche, donc il ne passe même pas dans cette fonction et du coup, ne set même pas self::$_destroyed à true.
Du coup comment fait-il pour passer dans l'exception !?
if (self::$_sessionStarted && self::$_destroyed) { require_once 'Zend/Session/Exception.php'; throw new Zend_Session_Exception('The session was explicitly destroyed during this request, attempting to re-start is not allowed.'); }
N'y a-t-il pas un souci dans les paramètres du serveur.....? j'avoue que je cale là.
merci de vos réponses
Hors ligne
j'ai testé aussi le changement de répertoire entre la version 1.0.3 QUI MARCHE et la version 1.5.2.:
if ($_SERVER['REMOTE_ADDR']== '<mon_ip>') { //test the development framework snapshot define ('ZEND_FRAMEWORK_DIR','/<path adéquat>/frameworkSnapshot/library'); }else { // dev PATH TO ZEND FRAMEWORK (version 1.5.2 dernier snapshot en cours) define ('ZEND_FRAMEWORK_DIR','/<path adéquat>/framework/library'); }
avec la version 1.0.3 ça fonctionne sans soucis, mais pas avec la 1.5.2...
quelqu'un a des idées?
Hors ligne
La je vois pas trop.
Tout ce que je peux te dire c'est que je viens aussi de passer en 1.5.2 et que je n'ai pas de soucis de ce coté.
essaie de faire un try catch autour du Zend_SEssion start pour voir si l'exception est bien jetée à ce moment ou si la session a été demarée avant ...
demarre ta session dans ton bootstrap
dans le bootstrap :
try{ Zend_Session::start ( ); }catch(Exception $e){ var_dump("echec du session start".$e->getMessage()); ob_flush(); die(); }
ailleurs action ou autre
$authInstance = Zend_Auth::getInstance(); if ($authInstance->hasIdentity()===true) { //stuff }
Dernière modification par ichevc02 (21-05-2008 14:23:34)
Hors ligne
hum,
je viens d'essayer mais sans succès: même message.
l'exception est levée lorsque je fais le $authInstance->hasIdentity() :
try{ $d = $authInstance->hasIdentity(); }catch(Exception $e){ var_dump("echec du session start : ".$e->getMessage()); ob_flush(); die(); }
j'obtiens
string(121) "echec du session start : The session was explicitly destroyed during this request, attempting to re-start is not allowed."
Dernière modification par PsY (21-05-2008 14:29:12)
Hors ligne
j'ai l'impression que c'est lorsque Zend_Auth appelle getStorage() et donc crée une nouvelle instance du namespace via $this->setStorage(new Zend_Auth_Storage_Session());
$this->_session = new Zend_Session_Namespace($this->_namespace);
dans Zend_Auth_Storage_Session.....
Dernière modification par PsY (21-05-2008 14:35:42)
Hors ligne
ton bout de code ci dessus est placé ou ??
essaie dans le bootstrap avant le dispatch du controller puis (si ca marche) dans le init du controller appelé ...
il doit y avoir quelque chose qui appel un Zend_session destroy ... je vois rien d'autre
utilise-tu des Zend_session_Namespace avant ?
Hors ligne
oui car Zend_auth se sert de la session pour garder les info d'authen.
donc quand tu fait le has->identify, il recupere son Namespace pour voir s'il y a rangé des infos.
Lorsque tu fait un new Zend_Session_Namespace , ca demarre la session si elle est pas deja demarré.
Et la il essaie de la demmarer mais la session est flaguée comme detruite.
Doc il faut trouvé où elle est detruite.
Je sais pas si je suis clair ....
Dernière modification par ichevc02 (21-05-2008 14:39:30)
Hors ligne
erf je viens d'éditer mon précédent message.
Sinon, tous les scripts sont dans le "prepend"
$authInstance->hasIdentity()
appelle Zend/Auth -> getStorage
qui lui crée
$this->setStorage(new Zend_Auth_Storage_Session());
qui lui :
$this->_session = new Zend_Session_Namespace($this->_namespace);
qui lui fait un
Zend_Session::start(true); // attempt auto-start (throws exception if strict option set)
je ne vois pas comment éviter le problème...ce que je ne comprends pas, c'est comment ça peut marcher chez les autres?
Comment est-ce que tu gères tes sessions et tes authentifications (si tu en as? )
Hors ligne
le problème c'est que j'ai mis un
die( '1stDestroy');
dans la première ligne de ma fonction Zend/Session.php -> function destroy(...), et que ça die jamais .....
Dernière modification par PsY (21-05-2008 14:41:36)
Hors ligne
Le probleme se situte a mon avis en amont dans ton appli.
c'est a dire avant ton appel a zend_auth->has->identity().
car tu as detruit ta session lors de la requete donc tu ne peux plus t'en servir (cf message précedent).
Hors ligne
vi, c'est bizarre ...
Hors ligne
et si j'enlève le
Zend_Session::start ( );
avant le
if ($authInstance->hasIdentity()===true) {
j'ai le message
string(129) "echec du session start : You must explicitly start the session with Zend_Session::start() when session options are set to strict."
cf:
try{ $d = $authInstance->hasIdentity(); }catch(Exception $e){ var_dump("echec du session start : ".$e->getMessage()); ob_flush(); die(); }
Hors ligne
Bon, j'ai tout viré sauf les defines des chemins et il me reste:
//Zend_Loader require_once ('Zend/Loader.php'); //Init Zend_Loader::registerAutoload (); Zend_Session::start (); $authInstance = Zend_Auth::getInstance(); try{ $d = $authInstance->hasIdentity(); }catch(Exception $e){ var_dump("echec du session start : ".$e->getMessage()); ob_flush(); die(); }
j'obtiens le message:
string(121) "echec du session start : The session was explicitly destroyed during this request, attempting to re-start is not allowed."
:-(
Dernière modification par PsY (21-05-2008 14:57:52)
Hors ligne
essaie ce code dans ton bootstrap avant le dispatch du controller.
Hors ligne
ben ce code est déjà dans le prépend ( en gros c mon bootstrap)
Hors ligne
ok j'avais pas saisi.
Bah la, j'ai plus trop d'idée.
As-tu testé que tes session (sans zend_auth) fonctionne bien ?
Hors ligne
Yes! tu as mis le doigt dessus.
sans l'authentification, la session marche.
.....serait-ce un bug?
Hors ligne
ca marche chez moi (la réponse qui enerve)
Hors ligne
tu as testé
http://www.paste2.org/p/30050
!!?? et ça marche ?
Hors ligne
oui
voici exactement le petit boostrap de test :
$start = microtime(true); $niveauErreur = E_ALL & ~E_NOTICE; error_reporting($niveauErreur); ini_set('display_error', 'Off'); //iconv_set_encoding('internal_encoding', 'ISO-8859-1'); $ini = ini_set("soap.wsdl_cache_enabled", 0); ini_set('zlib.output_compression', '0'); $longestTime = 0; setlocale(LC_ALL, 'fr_FR'); date_default_timezone_set('Europe/Paris'); set_include_path('.' . PATH_SEPARATOR . './library' . PATH_SEPARATOR . './library/incubator' . PATH_SEPARATOR . './modules/models' . PATH_SEPARATOR . './modules/webService/models' . PATH_SEPARATOR . get_include_path()); require_once ('Zend/Loader.php'); //Init Zend_Loader::registerAutoload (); Zend_Session::start (); $authInstance = Zend_Auth::getInstance(); try{ $d = $authInstance->hasIdentity(); }catch(Exception $e){ var_dump("Fail : ".$e->getMessage()); ob_flush(); die(); } die('ca a marché');
resultat :
ca a marché
Hors ligne
ah....
je viens de poster sur la mailing list....
http://www.nabble.com/Zend_Session-coup … 64322.html
on verra bien
je teste ton script demain :-)
@+
et merci
Hors ligne
J'ai fini de tester ton script et il n'a pas fonctionné.
j'ai changé le démarrage de ma session:
Zend_Session::setOptions( array('strict'=>false) );
sans la démarrer, et ce sera
$authInstance = Zend_Auth::getInstance(); if ($authInstance->hasIdentity()===true) { // blah }
qui s'en chargera. Là, j'ai toujours mon souci de démarrage de session:
'You must explicitly start the session with Zend_Session::start() when session options are set to strict.'
En revanche, je crois avoir trouvé mon souci:
$auth = Zend_Auth::getInstance(); //set the custom storage class to use //$auth->setStorage(new My_Auth_Storage_CustomStorage());
quand je veux utiliser ma propre classe de Storage, il ne faut surtout pas utiliser le code ci-dessus plusieurs fois.
Il doit y avoir des effets de bord indésirables que je ne comprends pas (en tous cas pour l'instant) qui settent self::$_destroyed
de la classe Zend_Session à autre chose que true (alors que ça doit être un booléen):
Exemple: j'ai créé un My_View_Helper_LogoutElement (Element de déconnexion) et j'y avais mis le morceau de code ci-dessous, la variable
self::$_destroyed à pris pour valeur 'My_View_Helper_LogoutElement'.
J'ai un autre exemple où la variable as pris pour valeur 'Object id #22'...dans un controlleur. Donc j'ai modifié ce code pour Zend_Auth::getInstance()->getStorage() puisque setStorage a déjà été utilisé dans le bootstrap.
Soit c'est une grossière erreur de ma part au niveau développement (je privilégie cette hypothèse, puisque je ne suis pas un as du dev), soit il faudrait modifier le code de Zend/Session.php pour y inclure le test suivant en début de fonction:
if (! is_bool(self::$_destroyed) && !empty(self::$_destroyed) ) { require_once 'Zend/Session/Exception.php'; throw new Zend_Session_Exception('The session is set as destroyed with the value "'.self::$_destroyed.'" but has not been explicitly destroyed during this request.'); }
En tous cas, merci merci pour ton aide !
je vais poster ça sur la mailing list aussi, et pourquoi pas ouvrir un ticket?
http://framework.zend.com/issues/browse/ZF-3308
Psy
Dernière modification par PsY (22-05-2008 14:27:20)
Hors ligne
Pages: 1