diff --git a/cron/cleanup.php b/cron/cleanup.php index 18d5d92..43a3e89 100644 --- a/cron/cleanup.php +++ b/cron/cleanup.php @@ -16,12 +16,6 @@ inactiveUserCheck(); /* check to see if there are orphaned versions in the database */ orphanVersionCheck(); -/* check and purge any orphaned messages stuck in sessionMessages table */ -orphanSessionMessagesCheck(); - -/* check and purge any expired sessions from the session_list table */ -orphanSessionListCheck(); - /* report error log entries to admins and flush the error log after doing so */ reportErrorLogEntries(); @@ -197,65 +191,6 @@ function orphanVersionCheck() mail_appdb($sEmail, $sSubject, $sMsg); } -/* this function checks to see if we have any orphaned session messages */ -/* These orphaned messages are an indication that we've put a message into */ -/* the system without displaying it and it becomes effectively lost forever */ -/* so we'll want to purge them here after reporting how many we have */ -function orphanSessionMessagesCheck() -{ - global $sEmailSubject; - - $iSessionMessageDayLimit = 1; /* the number of days a session message must be stuck before being purges */ - - /* get a count of the messages older than $iSessionMessageDayLimit */ - $sQuery = "SELECT count(*) as cnt from sessionMessages where TO_DAYS(NOW()) - TO_DAYS(time) > ?"; - $hResult = query_parameters($sQuery, $iSessionMessageDayLimit); - - $oRow = query_fetch_object($hResult); - $iMessages = $oRow->cnt; - - $sMsg = "Found ".$iMessages." that have been orphaned in the sessionMessages table for longer than ".$iSessionMessageDayLimit." days\r\n"; - $sMsg.= " Purging these messages.\r\n"; - - $sSubject = $sEmailSubject."Orphaned session messages cleanup\r\n"; - - $sEmail = User::get_notify_email_address_list(null, null); /* get list admins */ - if($sEmail) - mail_appdb($sEmail, $sSubject, $sMsg); - - /* purge the messages older than $iSessionMessageDayLimit */ - $sQuery = "DELETE from sessionMessages where TO_DAYS(NOW()) - TO_DAYS(time) > ?"; - $hResult = query_parameters($sQuery, $iSessionMessageDayLimit); -} - -/* this function checks to see if we have any orphaned sessions */ -/* sessions need to be expired or the session_list table will grow */ -/* by one row each time a user logs */ -function orphanSessionListCheck() -{ - global $sEmailSubject; - - /* get a count of the messages older than $iSessionListDayLimit */ - $sQuery = "SELECT count(*) as cnt from session_list where TO_DAYS(NOW()) - TO_DAYS(stamp) > ?"; - $hResult = query_parameters($sQuery, SESSION_DAYS_TO_EXPIRE + 2); - - $oRow = query_fetch_object($hResult); - $iMessages = $oRow->cnt; - - $sMsg = "Found ".$iMessages." sessions that have expired after ".(SESSION_DAYS_TO_EXPIRE + 2)." days\r\n"; - $sMsg.= " Purging these sessions.\r\n"; - - $sSubject = $sEmailSubject."Orphan sessions being expired\r\n"; - - $sEmail = User::get_notify_email_address_list(null, null); /* get list admins */ - if($sEmail) - mail_appdb($sEmail, $sSubject, $sMsg); - - /* purge the messages older than $iSessionMessageDayLimit */ - $sQuery = "DELETE from session_list where TO_DAYS(NOW()) - TO_DAYS(stamp) > ?"; - $hResult = query_parameters($sQuery, SESSION_DAYS_TO_EXPIRE + 2); -} - // report the database error log entries to the mailing list function reportErrorLogEntries() { diff --git a/include/incl.php b/include/incl.php index 3d0183e..b66f103 100644 --- a/include/incl.php +++ b/include/incl.php @@ -252,22 +252,13 @@ function pHttpDate($sDate) { */ function addmsg($shText, $color = "black") { - if($color) - $shText = " $shText \n"; - - $sQuery = "INSERT INTO sessionMessages VALUES (null, ?, '?', '?')"; - if (!query_parameters($sQuery, "NOW()", session_id(), $shText)) - { - echo "An error has occurred in addmsg()"; - echo $shText; - } + $GLOBALS['session']->addmsg($shText, $color); } function purgeSessionMessages() { - $sQuery = "truncate sessionMessages"; - query_parameters($sQuery); + $GLOBALS['session']->purgemsg(); } @@ -276,19 +267,17 @@ function purgeSessionMessages() */ function dumpmsgbuffer() { - $hResult = query_parameters("SELECT * FROM sessionMessages WHERE sessionId = '?'", session_id()); - if(!$hResult) - return; + $GLOBALS['session']->dumpmsgbuffer(); - while($oRow = query_fetch_object($hResult)) + echo html_frame_start("","300","",5); + foreach ($GLOBALS['session']->msg as $msg) { - echo html_frame_start("","300","",5); - echo "
$oRow->message
"; - echo html_frame_end(" "); - echo "
\n"; + if ($msg['color'] == "red") + $msg['color'] = "{$msg['color']};text-decoration:blink"; + echo "
{$msg['msg']}
"; } - - query_parameters("DELETE FROM sessionMessages WHERE sessionId = '?'", session_id()); + echo html_frame_end(" "); + echo "
\n"; } /** diff --git a/include/session.php b/include/session.php index 6bc7b32..8966261 100644 --- a/include/session.php +++ b/include/session.php @@ -2,25 +2,36 @@ /* * session.php - session handler functions - * sessions are stored in a database table + * sessions are stored in memcached + * http://www.danga.com/memcached/ */ -/* the number of days a session cookie is flaged to last */ -define("SESSION_DAYS_TO_EXPIRE", 2); - class session { + // defines + var $_server; + var $_expire; + var $_db; + var $name; + var $msg; + // create session object - function session ($name) + function session ($name, $server = "127.0.0.1", $expire = 2) { + // set the connection server + $this->_server = $server; + + // set the session and cookie expiration time in days (default 30 days) + $this->_expire = (60 * 60 * 24 * $expire); + // set name for this session $this->name = $name; // define options for sessions ini_set('session.name', $this->name); ini_set('session.use_cookies', true); - ini_set('session.use_only_cookies', true); - + ini_set('session.use_only_cookies', true); + // setup session object session_set_save_handler( array(&$this, "_open"), @@ -31,14 +42,20 @@ class session array(&$this, "_gc") ); - // default lifetime on session cookie (SESSION_DAYS_TO_EXPIRE days) + // default lifetime on session cookie session_set_cookie_params( - (60*60*24*SESSION_DAYS_TO_EXPIRE), + $this->_expire, '/' ); // start the loaded session - session_start(); + session_start(); + + // make sure we have a valid memcache server connection + if (!$this->_db->getVersion()) + { + trigger_error("Unable to Connect to Session Server", E_USER_ERROR); + } } // register variables into session (dynamic load and save of vars) @@ -57,52 +74,91 @@ class session // destroy session function destroy () { - if(session_id() != "") - session_destroy(); + session_destroy(); } - - // open session file (not needed for DB access) - function _open ($save_path, $session_name) { return true; } - // close session file (not needed for DB access) - function _close () { return true; } - - // read session - function _read ($key) + // add alert message to buffer that will be displayed on the Next page view of the same user in html class + function addmsg ($text, $color = "black") { - $result = query_parameters("SELECT data FROM session_list WHERE session_id = '?'", $key); - if (!$result) { return null; } - $oRow = query_fetch_object($result); - if($oRow) - return $oRow->data; + if (!isset($_SESSION['_msg'])) + $_SESSION['_msg'] = array(); + $_SESSION['_msg'][] = array( + 'msg' => $text, + 'color' => $color + ); + } + + // add alert message that will be displayed on the current page output in html class + function alert ($text, $color = "black") + { + $this->msg[] = array( + 'msg' => $text, + 'color' => $color + ); + } + + // clear session messages + function purgemsg () + { + $this->msg[] = array(); + $_SESSION['_msg'][] = array(); + } + + // output msg_buffer and clear it. + function dumpmsgbuffer () + { + if (isset($_SESSION['_msg']) and is_array($_SESSION['_msg'])) + { + foreach ($_SESSION['_msg'] as $alert) + { + $this->msg[] = $alert; + } + } + $_SESSION['_msg'] = array(); + } + + // connect to session + function _open ($save_path, $session_name) + { + $this->_db = new Memcache; + return $this->_db->connect($this->_server, "11211"); + } + + // close the session + function _close () + { + return $this->_db->close(); + } + + // restore a session from memory + function _read ($id) + { + return $this->_db->get($id); + } + + // write the session + function _write ($id, $data) + { + if ($this->_db->get($id)) + { + $this->_db->replace($id, $data, null, $this->_expire); + } else - return NULL; + { + $this->_db->set($id, $data, null, $this->_expire); + } + return true; } - - // write session to DB - function _write ($key, $value) - { - $messages = ""; - if(isset($GLOBALS['msg_buffer'])) - $messages = implode("|", $GLOBALS['msg_buffer']); - query_parameters("REPLACE session_list VALUES ('?', '?', '?', '?', '?', ?)", - $key, $_SESSION['current']->iUserId, get_remote(), $value, $messages, "NOW()"); - return true; - } - - // delete current session - function _destroy ($key) + // Delete the Session + function _destroy ($id) { - query_parameters("DELETE FROM session_list WHERE session_id = '?'", $key); - return true; + return $this->_db->delete($id); } - - // clear old sessions (moved into a separate cron process) + + // Garbage Collector (Not Needed for MemCache) function _gc ($maxlifetime) { - query_parameters("DELETE FROM session_list WHERE to_days(now()) - to_days(stamp) >= '?'", - SESSION_DAYS_TO_EXPIRE); return true; } diff --git a/tables/appdb_tables.sql b/tables/appdb_tables.sql index 2b3a479..2347ea7 100644 --- a/tables/appdb_tables.sql +++ b/tables/appdb_tables.sql @@ -13,7 +13,6 @@ drop table if exists appData; drop table if exists appBundle; drop table if exists appVotes; drop table if exists appNotes; -drop table if exists sessionMessages; /* @@ -176,15 +175,3 @@ create table appNotes ( key(noteId) ); - -/* - * - */ -create table sessionMessages ( - id int not null auto_increment, - time datetime, - sessionId varchar(32), - message text, - key(id), - index(sessionId) -); diff --git a/tables/create_tables b/tables/create_tables index 011b0a3..d41e1bd 100644 --- a/tables/create_tables +++ b/tables/create_tables @@ -5,12 +5,12 @@ echo NOTE: It is ok for this to fail if the user already exists echo there does not appear to be a way to create a user only echo if they do not exist so we have to live with a potential echo error after we try. -mysql -p -u root < create_user.sql +mysql -p -u root apidb < create_user.sql echo Create the apidb database, and tables cat create_apidb_base.sql appdb_tables.sql \ prefs_list.sql user_list.sql user_prefs.sql \ - user_privs.sql session_list.sql app_category.sql \ + user_privs.sql app_category.sql \ maintainers.sql buglinks.sql monitors.sql \ error_log.sql distributions.sql testResults.sql \ - | mysql -p -u root + | mysql -p -u root apidb diff --git a/tables/session_list.sql b/tables/session_list.sql deleted file mode 100644 index 2878f75..0000000 --- a/tables/session_list.sql +++ /dev/null @@ -1,13 +0,0 @@ -use apidb; - -DROP TABLE IF EXISTS session_list; - -CREATE TABLE session_list ( - session_id varchar(64) NOT NULL default '', - userid int(11) default NULL, - ip varchar(64) default NULL, - data text, - messages text, - stamp datetime NOT NULL, - PRIMARY KEY (session_id) -) TYPE=MyISAM; diff --git a/unit_test/run_tests.php b/unit_test/run_tests.php index ffc78f4..7b59e8c 100644 --- a/unit_test/run_tests.php +++ b/unit_test/run_tests.php @@ -104,7 +104,6 @@ class table_counts 'testResults', 'user_list', 'user_privs', - 'sessionMessages', 'vendor'); $this->update_counts();