martin
lundi 21 février 2005 à 12:49
Le shéma de la table mysql :
CODE
CREATE TABLE `nc_session` (
`unique_id` int(5) unsigned NOT NULL auto_increment,
`last_modification` datetime default '0000-00-00 00:00:00',
`valid` enum('yes','no') NOT NULL default 'yes',
`session_id` varchar(32) NOT NULL default '',
`remote_addr` varchar(15) NOT NULL default '',
`http_referer` varchar(100) NOT NULL default '',
`session_data` text NOT NULL,
PRIMARY KEY (`unique_id`),
KEY `session_key` (`session_id`),
KEY `valid` (`valid`),
KEY `valid_2` (`valid`)
) TYPE=MyISAM AUTO_INCREMENT=1;
Voici les fonctions :
CODE
function nc_session_open($path, $name)
{
return TRUE;
}
function nc_session_close()
{
return TRUE;
}
function nc_session_read($sess_id)
{
$data = nc_requete_mysql("SELECT session_data FROM ".session_table." WHERE session_id = '".$sess_id."' and remote_addr ='".$_SERVER['REMOTE_ADDR']."' AND valid = 'yes'");
if($data != TRUE)
{
return '';
}
if ($data['num_rows'] > 0)
{
return $data['result'][0]['session_data'];
}
else
{
return '';
}
}
function nc_session_write($sess_id, $sess_data)
{
$sess_data = mysql_escape_string($sess_data);
$sess_id = mysql_escape_string($sess_id);
$data = nc_requete_mysql("SELECT unique_id FROM ".session_table." WHERE session_id = '$sess_id' AND valid = 'yes' AND remote_addr ='".$_SERVER['REMOTE_ADDR']."'");
if($data != TRUE)
{
return FALSE;
}
if (isset($data['num_rows']) && $data['num_rows'] > 0)
{
$data = nc_requete_mysql("UPDATE ".session_table." SET session_data = '$sess_data', last_modification = now() WHERE session_id = '$sess_id'");
}
else
{
if(isset($_SERVER['HTTP_REFERER']))
{
$http_referer = $_SERVER['HTTP_REFERER'];
}
else
{
$http_referer = 'no_referer';
}
$data = nc_requete_mysql("INSERT INTO ".session_table." (last_modification, valid, session_id, session_data, remote_addr, http_referer) VALUES (now(),'yes', '$sess_id', '$sess_data', '".$_SERVER['REMOTE_ADDR']."', '".$http_referer."')");
}
return TRUE;
}
function nc_session_destroy($sess_id)
{
$sess_id = mysql_escape_string($sess_id);
$data = nc_requete_mysql("UPDATE ".session_table." SET valid = 'no' WHERE session_id = '$sess_id' and remote_addr ='".$_SERVER['REMOTE_ADDR']."'");
if($data != TRUE)
{
return FALSE;
}
else
{
return TRUE;
}
}
function nc_session_gc($maxlifetime)
{
$data = nc_requete_mysql("UPDATE ".session_table." set valid='no' WHERE last_modification < DATE_ADD(now(), INTERVAL -$maxlifetime SECOND)");
$data = nc_requete_mysql("OPTIMIZE TABLE ".session_table);
if($data != TRUE)
{
return FALSE;
}
else
{
return TRUE;
}
}
il reste ensuite à mettre cette ligne avant l'appel à session_start :
CODE
session_set_save_handler ('nc_session_open', 'nc_session_close', 'nc_session_read', 'nc_session_write', 'nc_session_destroy', 'nc_session_gc');
Tu remarqueras que je fait aussi appel à une gestion personalisée des requetes mysql. je te met aussi le code ;-) :
CODE
function nc_requete_mysql($requete)
{
global $nombre_requete_mysql;
debug('Requete SQL', $requete);
$mysql_link=mysql_connect(mysql_server, mysql_login, mysql_pass);
if(!$mysql_link)
{
trigger_error ('Connection base MySQL impossible', E_USER_ERROR);
}
$base_link = mysql_select_db(mysql_base, $mysql_link);
if(!$base_link)
{
trigger_error ('Connection table MySQL impossible', E_USER_ERROR);
}
$result=mysql_query($requete, $mysql_link);
if(!$result)
{
trigger_error ('Requete MySQL impossible', E_USER_ERROR);
}
else
{
if(ereg('SELECT', $requete))
{
$i = 0;
while($line = mysql_fetch_assoc($result))
{
foreach($line as $name => $value)
{
$data['result'][$i][$name] = $value;
}
$i++;
}
$data['num_rows'] = mysql_num_rows($result);
}
$data['nb_affected_rows'] = mysql_affected_rows($mysql_link);
$data['insert_id'] = mysql_insert_id ($mysql_link);
}
mysql_close($mysql_link);
$nombre_requete_mysql++;
if(isset($data))
{
return $data;
}
else
{
return FALSE;
}
}
Pour compter le nombre de membres conectés il suffit d'interroger la table sur le nombre de sessions valides. tu peux aussi decider de détruire les sessions au fur et à mesure au lieu de les invalider.