-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsession_manager.php
More file actions
112 lines (90 loc) · 3.95 KB
/
session_manager.php
File metadata and controls
112 lines (90 loc) · 3.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
// session_manager.php
class SessionManager {
private $occupied_file = "data/occupied_sessions.txt";
private $completed_file = "data/completed_sessions.txt";
private $session_format = "%d|%s"; // format: "id|timestamp"
private $timeout_minutes = 60; // 1 hour timeout
public function __construct() {
// Create files if they don't exist
foreach ([$this->occupied_file, $this->completed_file] as $file) {
if (!file_exists($file)) {
file_put_contents($file, "");
}
}
}
private function getCurrentTimestamp() {
return date('Y-m-d H:i:s');
}
private function parseSessionLine($line) {
$parts = explode('|', trim($line));
return [
'id' => intval($parts[0]),
'timestamp' => isset($parts[1]) ? $parts[1] : null
];
}
private function isSessionTimedOut($timestamp) {
if (!$timestamp) return true;
$session_time = strtotime($timestamp);
$current_time = time();
return ($current_time - $session_time) > ($this->timeout_minutes * 60);
}
private function cleanTimedOutSessions() {
$occupied_sessions = array_map('trim', file($this->occupied_file));
$active_sessions = [];
foreach ($occupied_sessions as $session) {
$session_data = $this->parseSessionLine($session);
if (!$this->isSessionTimedOut($session_data['timestamp'])) {
$active_sessions[] = $session;
}
}
file_put_contents($this->occupied_file, implode("\n", $active_sessions) . "\n");
}
public function getAvailableSession() {
// Clean timed out sessions first
$this->cleanTimedOutSessions();
// Get current occupied and completed sessions
$occupied_sessions = array_map([$this, 'parseSessionLine'], file($this->occupied_file));
$completed_sessions = array_map([$this, 'parseSessionLine'], file($this->completed_file));
$occupied_ids = array_column($occupied_sessions, 'id');
$completed_ids = array_column($completed_sessions, 'id');
$unavailable_ids = array_merge($occupied_ids, $completed_ids);
// Find first available ID
for ($i = 1; $i <= 400; $i++) {
if (!in_array($i, $unavailable_ids)) {
$new_session = sprintf($this->session_format, $i, $this->getCurrentTimestamp());
file_put_contents($this->occupied_file, $new_session . "\n", FILE_APPEND);
return $i;
}
}
return null;
}
public function completeSession($session_id) {
// Remove from occupied
$occupied_sessions = array_map('trim', file($this->occupied_file));
$active_sessions = [];
foreach ($occupied_sessions as $session) {
$session_data = $this->parseSessionLine($session);
if ($session_data['id'] != $session_id) {
$active_sessions[] = $session;
}
}
file_put_contents($this->occupied_file, implode("\n", $active_sessions) . "\n");
// Add to completed
$completed_session = sprintf($this->session_format, $session_id, $this->getCurrentTimestamp());
file_put_contents($this->completed_file, $completed_session . "\n", FILE_APPEND);
return true;
}
public function releaseSession($session_id) {
$occupied_sessions = array_map('trim', file($this->occupied_file));
$active_sessions = [];
foreach ($occupied_sessions as $session) {
$session_data = $this->parseSessionLine($session);
if ($session_data['id'] != $session_id) {
$active_sessions[] = $session;
}
}
file_put_contents($this->occupied_file, implode("\n", $active_sessions) . "\n");
return true;
}
}