aboutsummaryrefslogtreecommitdiffstats
path: root/public/system/library/session/file.php
diff options
context:
space:
mode:
Diffstat (limited to 'public/system/library/session/file.php')
-rw-r--r--public/system/library/session/file.php77
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