1<?php
2
3/**
4 * Session handling
5 * @package framework
6 * @subpackage session
7 */
8
9/**
10 * This session class uses a memcached to manage session data. It does not
11 * use PHP session handlers at all and is a completely indenpendant session system.
12 */
13class Hm_Memcached_Session extends Hm_DB_Session {
14
15    /* session key */
16    public $session_key = '';
17
18    /* memcached connection */
19    public $conn;
20
21    /* default session lifetime */
22    public $cache_lifetime = 86400;
23
24    /**
25     * Start the session. This could be an existing session or a new login
26     * @param object $request request details
27     * @return void
28     */
29    public function start($request, $existing_session=False) {
30        $this->db_start($request);
31    }
32
33    /**
34     * save data on session start
35     * @return boolean|integer|array
36     */
37    public function insert_session_row() {
38        return $this->save_data();
39    }
40
41    /**
42     * update memcache with current data
43     * @return boolean|integer|array
44     */
45    public function save_data() {
46        $enc_data = $this->ciphertext($this->data);
47        return $this->conn->set($this->session_key, $enc_data, $this->cache_lifetime);
48    }
49
50    /**
51     * End a session after a page request is complete. This only closes the session and
52     * does not destroy it
53     * @return void
54     */
55    public function end() {
56        if ($this->active && !$this->session_closed) {
57            $this->save_data();
58            $this->conn->close();
59        }
60        $this->active = false;
61    }
62
63    /**
64     * Close a session early, but don't destroy it
65     * @return void
66     */
67    public function close_early() {
68        $this->session_closed = true;
69        $this->save_data();
70        $this->conn->close();
71    }
72
73    /**
74     * Destroy a session for good
75     * @param object $request request details
76     * @return void
77     */
78    public function destroy($request) {
79        if (Hm_Functions::function_exists('delete_uploaded_files')) {
80            delete_uploaded_files($this);
81        }
82        $this->conn->del($this->session_key);
83        $this->delete_cookie($request, $this->cname);
84        $this->delete_cookie($request, 'hm_id');
85        $this->session_closed = true;
86        $this->conn->close();
87        $this->active = false;
88        Hm_Request_Key::load($this, $request, false);
89    }
90
91    /**
92     * @return boolean
93     */
94    public function connect() {
95        $this->conn = new Hm_Memcached($this->site_config);
96        return $this->conn->is_active();
97    }
98
99    /**
100     * Get session data from the DB
101     * @param string $key session key
102     * @return mixed array results or false on failure
103     */
104    public function get_session_data($key) {
105        return $this->plaintext($this->conn->get($key));
106    }
107
108}
109