Location: PHPKode > projects > MUSPA > session_handler.php
<?php
/*******************************************************************************
* MUSPA
*
* Copyright (C) 2004 MUSPA Project
*
* Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
* sob os termos da Licença Pública Geral GNU conforme publicada pela Free
* Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
* qualquer versão posterior.
*
* Este programa é distribuído na expectativa de que seja útil, porém, SEM
* NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
* ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral do
* GNU para mais detalhes.
*
* Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto com
* este programa; se não, escreva para a Free Software Foundation, Inc., no
* endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
*
*******************************************************************************/

/**
*
*	Session Handler
*
*/
class SessionHandler {

	/**	SQL ID da sessão	*/
	var $iSQLId;
	/**	DB Object			*/
	var $oDB;

	/**
	*	Constructor
	*	@param	$admin	DB Object.
	*/
	function SessionHandler( &$db )
	{
		$this->iSQLId = 0;
		if (!is_a($db, 'db'))
			trigger_error('Parâmetro 0 precisa ser uma instância da classe DB.', E_USER_ERROR);
		$this->oDB =& $db;

		// Se auto-instala como session handler...
		session_set_save_handler(	array(&$this, 'open'),
									array(&$this, 'close'),
									array(&$this, 'read'),
									array(&$this, 'write'),
									array(&$this, 'destroy'),
									array(&$this, 'gc'));

	}

	/**
	*	Abre a sessão
	*/
	function open( $save_path, $session_name )
	{
		return true;
	}

	/**
	*	Fecha a sessão
	*/
	function close()
	{
		return true;
	}

	/**
	*	Lê os dados da sessão
	*/
	function read( $id )
	{
		$this->oDB->query('SELECT id, data FROM '.PRE_TABLE.'sessions WHERE sessid = "'.$id.'"', __FILE__, __LINE__);
		if (!$this->oDB->numRows())
			return '';
		$this->iSQLId = $this->oDB->result(0, 0);
		return $this->oDB->result(0, 1);
	}

	/**
	*	Escreve os dados da sessão
	*/
	function write($id, $data)
	{
		$this->oDB->query('REPLACE INTO '.PRE_TABLE.'sessions SET id="'.$this->iSQLId.'", '
			.' sessid="'.$id.'", data="'.$this->oDB->escapeString($data, true).'", time=NOW()',
			__FILE__, __LINE__);
		return true;
	}

	/**
	*	Destroy a sessão
	*/
	function destroy($id)
	{
		// Apaga todos os arquivos temporarios desta seção
		$dir = opendir(TEMPDIR);
		while(($file = readdir($dir)) !== false)
			if (strpos($file, 'sess'.$id.'_') === 0)
				unlink(TEMPDIR.$file);
		closedir($dir);

		$this->oDB->query('DELETE FROM '.PRE_TABLE.'sessions WHERE sessid="'.$id.'"',
						__FILE__, __LINE__);
		return true;
	}

	/**
	*	Garbaga collector
	*/
	function gc( $maxtime )
	{
		$maxtime = 3600;	// Força o tempo mínimo para 1 hora.

		//	Procura todas as seções expiradas
		$this->oDB->query('SELECT sessid FROM '.PRE_TABLE.'sessions WHERE '
			.' DATE_SUB( NOW( ) , INTERVAL '.$maxtime.' SECOND ) > time', __FILE__, __LINE__);

		if (!$this->oDB->numRows())
			return true;

		// Para cada seção expirada, apague seus arquivos temporarios
		$dir = opendir(TEMPDIR);
		while($row = $this->oDB->fetchAssoc())
		{
			rewinddir($dir);
			while(($file = readdir($dir)) !== false)
				if (strpos($file, 'sess'.$row['sessid'].'_') === 0)
					unlink(TEMPDIR.$file);
		}
		closedir($dir);

		// finalmente... apague as seções expiradas do DB
		$this->oDB->query('DELETE FROM '.PRE_TABLE.'sessions WHERE '
			.' DATE_SUB( NOW() , INTERVAL '.$maxtime.' SECOND ) > time', __FILE__, __LINE__);
		return true;
	}
};

/**
*	Retorna uma sugestão de nome de arquivo
*	Obs.: Talvez esta função devesse ficar dentro da classe SessionHandler.
*/
function sess_CreateFileName( $file )
{
	return TEMPDIR.'sess'.session_id().'_'.$file;
}

Return current item: MUSPA