source: github/program/include/session.inc @ cc95700

HEADcourier-fixdev-browser-capabilitiespdorelease-0.6release-0.7release-0.8
Last change on this file since cc95700 was cc95700, checked in by thomascube <thomas@…>, 7 years ago

Added message cache garbage collector

  • Property mode set to 100644
File size: 4.1 KB
Line 
1<?php
2
3/*
4 +-----------------------------------------------------------------------+
5 | program/include/session.inc                                           |
6 |                                                                       |
7 | This file is part of the RoundCube Webmail client                     |
8 | Copyright (C) 2005, RoundCube Dev, - Switzerland                      |
9 | Licensed under the GNU GPL                                            |
10 |                                                                       |
11 | PURPOSE:                                                              |
12 |   Provide database supported session management                       |
13 |                                                                       |
14 +-----------------------------------------------------------------------+
15 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
16 +-----------------------------------------------------------------------+
17
18 $Id$
19
20*/
21
22
23function sess_open($save_path, $session_name)
24  {
25  return TRUE;
26  }
27
28
29
30function sess_close()
31  {
32  return TRUE;
33  }
34
35
36// read session data
37function sess_read($key)
38  {
39  global $DB, $SESS_CHANGED;
40 
41  $sql_result = $DB->query("SELECT vars, ip, ".$DB->unixtimestamp('changed')." AS changed
42                            FROM ".get_table_name('session')."
43                            WHERE  sess_id=?",
44                            $key);
45
46  if ($sql_arr = $DB->fetch_assoc($sql_result))
47    {
48    $SESS_CHANGED = mktime(); //$sql_arr['changed'];
49
50    if (strlen($sql_arr['vars']))
51      return $sql_arr['vars'];
52    }
53
54  return FALSE;
55  }
56 
57
58// save session data
59function sess_write($key, $vars)
60  {
61  global $DB;
62
63  $sql_result = $DB->query("SELECT 1
64                            FROM ".get_table_name('session')."
65                            WHERE  sess_id=?",
66                            $key);
67
68  if ($DB->num_rows($sql_result))
69    {
70    session_decode($vars);
71    $DB->query("UPDATE ".get_table_name('session')."
72                SET    vars=?,
73                       changed=now()
74                WHERE  sess_id=?",
75                $vars,
76                $key);
77    }
78  else
79    {
80    $DB->query("INSERT INTO ".get_table_name('session')."
81                (sess_id, vars, ip, created, changed)
82                VALUES (?, ?, ?, now(), now())",
83                $key,
84                $vars,
85                $_SERVER['REMOTE_ADDR']);
86               
87
88    }
89
90  return TRUE;
91  }
92
93
94// handler for session_destroy()
95function sess_destroy($key)
96  {
97  global $DB;
98 
99  // delete session entries in cache table
100  $DB->query("DELETE FROM ".get_table_name('cache')."
101              WHERE  session_id=?",
102              $key);
103             
104  $DB->query("DELETE FROM ".get_table_name('session')."
105              WHERE sess_id=?",
106              $key);
107
108  rcmail_clear_session_temp($key);
109  return TRUE;
110  }
111
112
113// garbage collecting function
114function sess_gc($maxlifetime)
115  {
116  global $DB;
117
118  // get all expired sessions 
119  $sql_result = $DB->query("SELECT sess_id
120                            FROM ".get_table_name('session')."
121                            WHERE ".$DB->unixtimestamp('now()')."-".$DB->unixtimestamp('changed')." > ?",
122                            $maxlifetime);
123                                   
124  $a_exp_sessions = array();
125  while ($sql_arr = $DB->fetch_assoc($sql_result))
126    $a_exp_sessions[] = $sql_arr['sess_id'];
127
128 
129  if (sizeof($a_exp_sessions))
130    {
131    // delete session cache records
132    $DB->query("DELETE FROM ".get_table_name('cache')."
133                WHERE  session_id IN ('".join("','", $a_exp_sessions)."')");
134               
135    // delete session records
136    $DB->query("DELETE FROM ".get_table_name('session')."
137                WHERE sess_id IN ('".join("','", $a_exp_sessions)."')");
138    }
139
140  // remove session specific temp dirs
141  foreach ($a_exp_sessions as $key)
142    rcmail_clear_session_temp($key);
143
144  // also run message cache GC
145  rcmail_message_cache_gc();
146
147  return TRUE;
148  }
149
150
151// set custom functions for PHP session management
152session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc');
153
154?>
Note: See TracBrowser for help on using the repository browser.