Re: Online Users
| From: | Matt Palermo | Date: | Fri, 02 Jul 2004 16:34:37 +0000 |
| Subject: | Re: Online Users | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-189547@lists.php.net to get a copy of this message | ||
This looks like a good solution. What is the best way to list the current
users, since the sesssionData seems to be serialized in the db or something?
I just want to list out all the users from the db.
Thanks,
Matt
http://sweetphp.com
"Greg Donald" <destiney@gmail.com> wrote in message
news:ea9da26c040702052617169185@mail.gmail.com...
> On Fri, 2 Jul 2004 01:13:14 -0400, Matt Palermo <webmaster@sweetphp.com>
wrote:
> >
> > Is it possible to make a table of all logged in users session ids and
then
> > check to see if the session still exists every couple minutes? So every
> > minute or two, it would go through the table and for each record it
would
> > get the session id, then check that session id to see if it's still in
> > existance. Is this possible to do?
>
> This is simple to accomplish if you use database managed PHP sessions.
> You can override the default PHP session handling functions with
> session_set_save_handler() then you will know what users are logged in
> by what sessions are still active. Here's how I do it:
>
> My sessions.php that I require in all other scripts on the site:
>
> <?php
>
> if(ini_get('session.use_trans_sid')==0){
> ini_set("session.use_trans_sid", 1);
> }
>
> $sessionDbHandler = '';
>
> function sessionOpen($save_path, $session_name){
> global $sessionDbHandler;
> if(! $sessionDbHandler = mysql_pconnect(DB_HOST, DB_USER, DB_PASS)){
> die("Can't get sessionDbHandler: ".mysql_error());
> }
> return true;
> }
>
> function sessionClose(){
> return true;
> }
>
> function sessionRead($key){
> $sql = "
> select
> sessionData
> from
> ".TB_USER_SESSIONS."
> where
> sessionID = '$key'
> and
> sessionExpire > UNIX_TIMESTAMP()
> ";
> $query = mysql_query($sql);
> if(mysql_num_rows($query)){
> return mysql_result($query, 0, "sessionData");
> }
> return false;
> }
>
> function sessionWrite($key, $val){
> $value = addslashes($val);
> $sql = "
> replace into ".TB_USER_SESSIONS." (
> sessionID,
> sessionData,
> sessionExpire
> ) values (
> '$key',
> '$value',
> UNIX_TIMESTAMP() + ".SITE_ONLINE_EXPIRE."
> )
> ";
> return mysql_query($sql);
> }
>
> function sessionDestroy($key){
> $sql = "
> delete from
> ".TB_USER_SESSIONS."
> where
> sessionID = '$key'
> ";
> return mysql_query($sql);
> }
>
> function sessionGarbageCollection(){
> $sql = "
> delete from
> ".TB_USER_SESSIONS."
> where
> sessionExpire < UNIX_TIMESTAMP()
> ";
> $query = mysql_query($sql);
> return sqlAffectedRows();
> }
>
> session_set_save_handler("sessionOpen", "sessionClose",
> "sessionRead", "sessionWrite", "sessionDestroy",
> "sessionGarbageCollection");
> session_start();
>
> ?>
>
> Some config.php variables:
> define('DB_HOST', 'localhost');
> define('DB_DB', 'db_name');
> define('DB_USER', 'db_user');
> define('DB_PASS', 'db_pass');
> define('TB_USER_SESSIONS', 'userSessions');
> define('SITE_ONLINE_EXPIRE', 900);
>
> The table structure for userSessions looks like this:
>
> CREATE TABLE
userSessions (
> sessionID varchar(32) NOT NULL default '',
> sessionData text NOT NULL,
> sessionExpire int(10) unsigned NOT NULL default
> '0',
> PRIMARY KEY (sessionID)
> ) TYPE=MyISAM;
>
> When a user logs in you are probably already setting some kind of
> userID or userName, so make that a session variable if it is not
> already. Then it's just a matter of listing the userNames or userIDs
> out of the userSessions table.
>
> You might want to force session garbage collection at the top of each
> script by calling sessionGarbageCollection(). That will make the
> username listings more realtime.
>
>
> --
> Greg Donald
> http://destiney.com/