Re: Session Vars and Performance
| From: | Marek Kilimajer | Date: | Fri, 18 Feb 2005 07:56:59 +0000 |
| Subject: | Re: Session Vars and Performance | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-208999@lists.php.net to get a copy of this message | ||
Greg Donald wrote:
On Wed, 16 Feb 2005 09:36:26 -0800 (PST), Richard Lynch <ceo@l-i-e.com> wrote:The code misses one important thing - row locking. For concurent requests, sess_open must block until the first request does sess_close(). So you need to use InnoDB's row locking or application-level GET_LOCK() and RELEASE_LOCK().It's literally an hour's work to alter the code to use MySQL to store the sessions instead of the hard drive.Not really, maybe 5 minutes.. here's the code:
Make the table in your database: CREATE TABLEsessions(); Make a sessions.php file: <?php // MySQL database connection parameters:idvarchar(32) NOT NULL default '',datatext NOT NULL,expireint(11) unsigned NOT NULL default '0', PRIMARY KEY (id)$dbhost = 'localhost'; $dbuser = 'dbuser';$dbpasswd = 'dbpassword';$dbname = 'dbname';// Sessions table name: $tb_sessions = 'sessions'; // Session lifetime in seconds: $online_expire = 900; // Use transparent sessions: ini_set( 'session.use_trans_sid', 1); // Below here should not require any changes $sdbh = ''; function sess_open( $save_path, $session_name ) {global $sdbh;if( ! $sdbh = mysql_pconnect( $dbhost, $dbuser, $dbpasswd ) ) {echo mysql_error();exit();}return true;} function sess_close() { return true; } function sess_read( $key ) {global $sdbh, $dbname, $tb_sessions;$sql = "SELECT data FROM $tb_sessions WHERE id = '$key' AND expire > UNIX_TIMESTAMP() ";$query = mysql_query( $sql ) or die( mysql_error() );if( mysql_num_rows( $query ) ) {return mysql_result( $query, 0, 'data' ); } return false; } function sess_write( $key, $val ) {global $tb_sessions, $online_expire;$value = addslashes( $val );$sql = "REPLACE INTO $tb_sessions (id,data, expire ) VALUES ( '$key', '$value', UNIX_TIMESTAMP() + $online_expire ) ";return mysql_query( $sql ) or die( mysql_error() );} function sess_destroy( $key ) {global $tb_sessions;$sql = "DELETE FROM $tb_sessions WHERE id = '$key' ";return mysql_query( $sql ) or die( mysql_error() );} function sess_gc() {global $tb_sessions;$sql = "DELETE FROM $tb_sessions WHERE expire < UNIX_TIMESTAMP() ";$query = mysql_query( $sql ) or die( mysql_error() );return mysql_affected_rows();} session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc'); session_start();$sn = session_name(); $sid = session_id();?> Then you just do include( 'sessions.php' ); http://wiki.destiney.com/DBSessions/Install