diff options
author | Jesús <heckyel@hyperbola.info> | 2019-08-18 21:14:58 -0500 |
---|---|---|
committer | Jesús <heckyel@hyperbola.info> | 2019-08-18 21:14:58 -0500 |
commit | 2eed7b082f83630301e51f57ca8394de228a8605 (patch) | |
tree | 1d19962d22d30f99317d9276e4bae7744fc93fc2 /public/system/library/session | |
download | librecart-2eed7b082f83630301e51f57ca8394de228a8605.tar.lz librecart-2eed7b082f83630301e51f57ca8394de228a8605.tar.xz librecart-2eed7b082f83630301e51f57ca8394de228a8605.zip |
first commit
Diffstat (limited to 'public/system/library/session')
-rw-r--r-- | public/system/library/session/db.php | 49 | ||||
-rw-r--r-- | public/system/library/session/file.php | 77 |
2 files changed, 126 insertions, 0 deletions
diff --git a/public/system/library/session/db.php b/public/system/library/session/db.php new file mode 100644 index 0000000..99882c7 --- /dev/null +++ b/public/system/library/session/db.php @@ -0,0 +1,49 @@ +<?php +/* +CREATE TABLE IF NOT EXISTS `session` ( + `session_id` varchar(32) NOT NULL, + `data` text NOT NULL, + `expire` datetime NOT NULL, + PRIMARY KEY (`session_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +*/ +namespace Session; +final class DB { + public $expire = ''; + + public function __construct($registry) { + $this->db = $registry->get('db'); + + $this->expire = ini_get('session.gc_maxlifetime'); + } + + public function read($session_id) { + $query = $this->db->query("SELECT `data` FROM `" . DB_PREFIX . "session` WHERE session_id = '" . $this->db->escape($session_id) . "' AND expire > " . (int)time()); + + if ($query->num_rows) { + return json_decode($query->row['data'], true); + } else { + return false; + } + } + + public function write($session_id, $data) { + if ($session_id) { + $this->db->query("REPLACE INTO `" . DB_PREFIX . "session` SET session_id = '" . $this->db->escape($session_id) . "', `data` = '" . $this->db->escape(json_encode($data)) . "', expire = '" . $this->db->escape(date('Y-m-d H:i:s', time() + $this->expire)) . "'"); + } + + return true; + } + + public function destroy($session_id) { + $this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE session_id = '" . $this->db->escape($session_id) . "'"); + + return true; + } + + public function gc($expire) { + $this->db->query("DELETE FROM `" . DB_PREFIX . "session` WHERE expire < " . ((int)time() + $expire)); + + return true; + } +} diff --git a/public/system/library/session/file.php b/public/system/library/session/file.php new file mode 100644 index 0000000..4a3b821 --- /dev/null +++ b/public/system/library/session/file.php @@ -0,0 +1,77 @@ +<?php +namespace Session; +class File { + private $directory; + + public function read($session_id) { + $file = DIR_SESSION . '/sess_' . basename($session_id); + + if (is_file($file)) { + $handle = fopen($file, 'r'); + + flock($handle, LOCK_SH); + + $data = fread($handle, filesize($file)); + + flock($handle, LOCK_UN); + + fclose($handle); + + return unserialize($data); + } else { + return array(); + } + } + + public function write($session_id, $data) { + $file = DIR_SESSION . '/sess_' . basename($session_id); + + $handle = fopen($file, 'w'); + + flock($handle, LOCK_EX); + + fwrite($handle, serialize($data)); + + fflush($handle); + + flock($handle, LOCK_UN); + + fclose($handle); + + return true; + } + + public function destroy($session_id) { + $file = DIR_SESSION . '/sess_' . basename($session_id); + + if (is_file($file)) { + unset($file); + } + } + + public function __destruct() { + if (ini_get('session.gc_divisor')) { + $gc_divisor = ini_get('session.gc_divisor'); + } else { + $gc_divisor = 1; + } + + if (ini_get('session.gc_probability')) { + $gc_probability = ini_get('session.gc_probability'); + } else { + $gc_probability = 1; + } + + if ((rand() % $gc_divisor) < $gc_probability) { + $expire = time() - ini_get('session.gc_maxlifetime'); + + $files = glob(DIR_SESSION . '/sess_*'); + + foreach ($files as $file) { + if (filemtime($file) < $expire) { + unlink($file); + } + } + } + } +}
\ No newline at end of file |