diff options
Diffstat (limited to 'public/system/library/session/file.php')
-rw-r--r-- | public/system/library/session/file.php | 77 |
1 files changed, 77 insertions, 0 deletions
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 |