]> git.mxchange.org Git - friendica.git/blob - src/Core/Session/DatabaseSessionHandler.php
Merge pull request #4382 from MrPetovan/task/3878-move-session-to-src
[friendica.git] / src / Core / Session / DatabaseSessionHandler.php
1 <?php\r
2 \r
3 namespace Friendica\Core\Session;\r
4 \r
5 use Friendica\BaseObject;\r
6 use Friendica\Core\Session;\r
7 use Friendica\Database\DBM;\r
8 use SessionHandlerInterface;\r
9 use dba;\r
10 \r
11 require_once 'boot.php';\r
12 require_once 'include/dba.php';\r
13 require_once 'include/text.php';\r
14 \r
15 /**\r
16  * SessionHandler using database\r
17  *\r
18  * @author Hypolite Petovan <mrpetovan@gmail.com>\r
19  */\r
20 class DatabaseSessionHandler extends BaseObject implements SessionHandlerInterface\r
21 {\r
22         public function open($save_path, $session_name)\r
23         {\r
24                 return true;\r
25         }\r
26 \r
27         public function read($session_id)\r
28         {\r
29                 if (!x($session_id)) {\r
30                         return '';\r
31                 }\r
32 \r
33                 $session = dba::selectFirst('session', ['data'], ['sid' => $session_id]);\r
34                 if (DBM::is_result($session)) {\r
35                         Session::$exists = true;\r
36                         return $session['data'];\r
37                 }\r
38                 logger("no data for session $session_id", LOGGER_TRACE);\r
39 \r
40                 return '';\r
41         }\r
42 \r
43         /**\r
44          * @brief Standard PHP session write callback\r
45          *\r
46          * This callback updates the DB-stored session data and/or the expiration depending\r
47          * on the case. Uses the Session::expire global for existing session, 5 minutes\r
48          * for newly created session.\r
49          *\r
50          * @param  string $session_id   Session ID with format: [a-z0-9]{26}\r
51          * @param  string $session_data Serialized session data\r
52          * @return boolean Returns false if parameters are missing, true otherwise\r
53          */\r
54         public function write($session_id, $session_data)\r
55         {\r
56                 if (!$session_id) {\r
57                         return false;\r
58                 }\r
59 \r
60                 if (!$session_data) {\r
61                         return true;\r
62                 }\r
63 \r
64                 $expire = time() + Session::$expire;\r
65                 $default_expire = time() + 300;\r
66 \r
67                 if (Session::$exists) {\r
68                         $fields = ['data' => $session_data, 'expire' => $expire];\r
69                         $condition = ["`sid` = ? AND (`data` != ? OR `expire` != ?)", $session_id, $session_data, $expire];\r
70                         dba::update('session', $fields, $condition);\r
71                 } else {\r
72                         $fields = ['sid' => $session_id, 'expire' => $default_expire, 'data' => $session_data];\r
73                         dba::insert('session', $fields);\r
74                 }\r
75 \r
76                 return true;\r
77         }\r
78 \r
79         public function close()\r
80         {\r
81                 return true;\r
82         }\r
83 \r
84         public function destroy($id)\r
85         {\r
86                 dba::delete('session', ['sid' => $id]);\r
87                 return true;\r
88         }\r
89 \r
90         public function gc($maxlifetime)\r
91         {\r
92                 dba::delete('session', ["`expire` < ?", time()]);\r
93                 return true;\r
94         }\r
95 }\r