Ejecutar Un Código Al Destruir O Expirar Sesion

¡Hola a todos!

Soy nuevo en el framework y hay cosas que no me quedan muy claras.

Me gustaría saber si es posible meter una funcionalidad que se produzca al expirar una sesión. Esta parte no me ha quedado nada clara, ya que, no termino de entender como maneja las sesiones Yii. Hay algún lugar donde venga explicado (no el sistema de login sino si como y donde almacena las sesiones, he visto que incluso utiliza una tabla en una bases de datos).

¡Gracias de antemano!

No lo he intentado, pues todavía no he encontrado una situación donde lo requiera, pero hay varias formas de lograrlo…

[list=1][]Sobrecargando los métodos de la clase CHttpSession.[]Usando behaviors (este creo que es el más limpio de todos, aunque no estoy seguro de que sea el más sencillo)[*]Usando las funciones propias de PHP (pues yii a su vez las usa)[/list]

Saludos.

No termina de funcionar ya que no crea la sesión, así qué supongo que algo no estoy haciendo bien…

He creado la clase CHttpSessionExt que hereda de CHttpSession y he sobrecargado los métodos:

  • getUseCustomStorage()

  • openSession

  • closeSession

  • readSession

  • writeSession

  • destroySession

  • gcSession

tal y como se indica en la documentación. En cada método he puesto una traza de control y un "return parent::method" con la intención de que tenga el mismo funcionamiento que CHttpSession.

En el fichero de configuración he creado un componente:




'session'=>array(

'class' => 'application.components.CHttpSessionExt',						 

),

Y con el log de la aplicación he puesto una traza por los métodos que he sobrecargado, a ver lo que está sucediendo.

2012/12/17 18:46:13 [trace] [application] [CHttpSessionExt][openSession] start /var/lib/php5 -> PHPSESSID

2012/12/17 18:46:13 [trace] [application] [CHttpSessionExt][readSession] start dqfq2tqcq2uvst4rr3eutr1jm2

2012/12/17 18:46:13 [trace] [application] [CHttpSessionExt][destroySession] start destruction: dqfq2tqcq2uvst4rr3eutr1jm2

2012/12/17 18:46:13 [trace] [application] [CHttpSessionExt][openSession] start /var/lib/php5 -> PHPSESSID

2012/12/17 18:46:13 [trace] [application] [CHttpSessionExt][readSession] start 6tinj4hoeuftbr72dilekt6577

Según aparece en el log crea una sessión y la destruye para más tarde crear una nueva. Verificando el directorio /var/lib/php5, la nueva sesión no tiene ningún archivo por lo que realmente no está creando ninguna sesión.

¿Alguna idea?

Después de investigar un poco he visto que eso lo hace normalmente Yii. Si el nombre de usuario y la contraseña son correctos se borra la sesión y se crea una nueva con el usuario logado devolviendo el nuevo id de sesión al usuario.

El problema viene porque no se está creando el archivo de sesión en el servidor. Si cambio la ruta en el config funciona perfectamente. En el momento que cambio el componente para manejar la sesión, no se guardan las sesiones en el path (este o el de por defecto si comento ‘savePath’).


'session'=>array(

 //'class' => 'application.components.CHttpSessionExt',

 'autoStart' => true,

 'cookieMode' => 'only',

 'savePath' =>  dirname(__FILE__).DIRECTORY_SEPARATOR.'../runtime/sessions'

),

El componente que controla la sesión:




class CHttpSessionExt extends CHttpSession{

	/*

	public function init(){

		parent::init();		

	}*/

	

	public function getUseCustomStorage(){

		return true;

	}

	/*

	 *  openSession, closeSession, readSession, writeSession, destroySession, and gcSession 

	 * */

	

	public function openSession($savePath, $sessionName){		

		Yii::trace( '[CHttpSessionExt][openSession] start '.$savePath.' -> '.$sessionName );	

		return true;		

	}

	

	public function closeSession(){

		Yii::trace( '[CHttpSessionExt][closeSession] start' );		

		return true;

	}

	public function readSession($id){

		Yii::trace( '[CHttpSessionExt][readSession] start '.$id );		

		return true;

	}

	public function writeSession($id, $data){

		Yii::trace( '[CHttpSessionExt][writeSession] start '.$id.' -> '.$data );		

		return true;

	}

	public function destroySession($id){		

		Yii::trace( '[CHttpSessionExt][destroySession] start destruction: '.$id );		

		return true;

	}

	

	public function gcSession($maxLifetime){

		Yii::trace( '[CHttpSessionExt][gcSession] start $maxLifetime:'.$maxLifetime );		

		return true;

	}	

}



¿Por que este componente no salva la sesión de un usuario en el path asignado mientras que el componente por defecto si lo hace?