aboutsummaryrefslogtreecommitdiffstats
path: root/public/system/library/session
diff options
context:
space:
mode:
authorJesús <heckyel@hyperbola.info>2019-08-18 21:14:58 -0500
committerJesús <heckyel@hyperbola.info>2019-08-18 21:14:58 -0500
commit2eed7b082f83630301e51f57ca8394de228a8605 (patch)
tree1d19962d22d30f99317d9276e4bae7744fc93fc2 /public/system/library/session
downloadlibrecart-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.php49
-rw-r--r--public/system/library/session/file.php77
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