Skip to content

Commit 672f557

Browse files
committed
Merge branch 'v0.1' of https://raaghu@gitlab.com/php-platform/web-session.git into v0.1
2 parents 18451d5 + 3c58f02 commit 672f557

File tree

1 file changed

+104
-33
lines changed

1 file changed

+104
-33
lines changed
Lines changed: 104 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,104 @@
1-
<?php
2-
3-
namespace PhpPlatform\WebSession;
4-
5-
use PhpPlatform\JSONCache\Cache;
6-
use PhpPlatform\Config\Settings;
7-
8-
class DeleteExpiredSessions {
9-
10-
static function run(){
11-
$lastAccessKeyRP = new \ReflectionProperty('PhpPlatform\WebSession\Session', '_lasAccessKey');
12-
$lastAccessKeyRP->setAccessible(true);
13-
$lastAccessKey = $lastAccessKeyRP->getValue();
14-
$sessions = Cache::getInstance()->getData($lastAccessKey);
15-
16-
if(is_array($sessions)){
17-
$sessionFilePrefix = Settings::getSettings(Package::Name,'sessionFilePrefix');
18-
$sessionTimeOut = Settings::getSettings(Package::Name,'timeout');
19-
$sessionSalt = Settings::getSettings(Package::Name,'salt');
20-
21-
foreach ($sessions as $sessionId=>$lastAccessTime){
22-
if(time() - $lastAccessTime > 2 * $sessionTimeOut){
23-
$sessionFileName = md5($sessionSalt.$sessionId);
24-
$sessionFileName = $sessionFilePrefix.$sessionFileName;
25-
if(is_file($sessionFileName)){
26-
unlink($sessionFileName);
27-
}
28-
}
29-
}
30-
}
31-
}
32-
33-
}
1+
<?php
2+
3+
namespace PhpPlatform\WebSession;
4+
5+
use PhpPlatform\JSONCache\Cache;
6+
use PhpPlatform\Config\Settings;
7+
8+
class DeleteExpiredSessions {
9+
10+
static function run(){
11+
12+
$lastAccessKeyRP = new \ReflectionProperty('PhpPlatform\WebSession\Session', '_lasAccessKey');
13+
$lastAccessKeyRP->setAccessible(true);
14+
$lastAccessKey = $lastAccessKeyRP->getValue();
15+
$sessions = Cache::getInstance()->getData($lastAccessKey);
16+
17+
if(is_array($sessions)){
18+
$sessionFilePrefix = Settings::getSettings(Package::Name,'sessionFilePrefix');
19+
$sessionTimeOut = Settings::getSettings(Package::Name,'timeout');
20+
$sessionSalt = Settings::getSettings(Package::Name,'salt');
21+
22+
$deletedSessions = array();
23+
foreach ($sessions as $sessionId=>$lastAccessTime){
24+
if(time() - $lastAccessTime > 2 * $sessionTimeOut){
25+
$sessionFileName = md5($sessionSalt.$sessionId);
26+
$sessionFileName = sys_get_temp_dir().'/'.$sessionFilePrefix.$sessionFileName;
27+
if(is_file($sessionFileName)){
28+
echo "Deleting $sessionFileName";
29+
unlink($sessionFileName);
30+
}
31+
$deletedSessions[] = $sessionId;
32+
}
33+
}
34+
35+
if(count($deletedSessions) > 0){
36+
$jsonCacheFileNameRP = new \ReflectionProperty('PhpPlatform\JSONCache\Cache', 'cacheFileName');
37+
$cache = Cache::getInstance();
38+
$jsonCacheFileNameRP->setAccessible(true);
39+
$jsonCacheFileName = $jsonCacheFileNameRP->getValue($cache);
40+
41+
42+
try{
43+
//read from cache file with write lock
44+
$fp = fopen($jsonCacheFileName, "c+");
45+
$fileLock = flock($fp, LOCK_EX | LOCK_NB);
46+
if($fileLock){
47+
clearstatcache(true,$jsonCacheFileName);
48+
if(filesize($jsonCacheFileName) > 0){
49+
$contents = fread($fp, filesize($jsonCacheFileName));
50+
}else{
51+
$contents = "{}";
52+
}
53+
$settings = json_decode($contents,true);
54+
if($settings === NULL){
55+
$settings = "{}";
56+
}
57+
}else{
58+
// dont do anything;
59+
}
60+
61+
// unset deleted sessions
62+
$lastAccessKeys = explode('.', $lastAccessKey);
63+
$lastAccessTimeForSession = &$settings;
64+
foreach ($lastAccessKeys as $_lastAccessKey){
65+
if(!array_key_exists($_lastAccessKey, $lastAccessTimeForSession)){
66+
$lastAccessTimeForSession[$_lastAccessKey] = array();
67+
}
68+
$lastAccessTimeForSession = &$lastAccessTimeForSession[$_lastAccessKey];
69+
}
70+
71+
if(is_array($lastAccessTimeForSession)){
72+
foreach ($deletedSessions as $deletedSession){
73+
unset($lastAccessTimeForSession[$deletedSession]);
74+
}
75+
}
76+
77+
$jsonSettings = json_encode($settings);
78+
if($jsonSettings === FALSE){
79+
throw new \Exception();
80+
}
81+
82+
if($fileLock){
83+
ftruncate($fp,0);
84+
rewind($fp);
85+
if(fwrite($fp, $jsonSettings,strlen($jsonSettings)) === FALSE){
86+
throw new \Exception();
87+
}
88+
}else{
89+
// no lock, so dont update the cache file this time
90+
}
91+
92+
}catch (\Exception $e){
93+
flock($fp, LOCK_UN);
94+
fclose($fp);
95+
return FALSE;
96+
}
97+
flock($fp, LOCK_UN);
98+
fclose($fp);
99+
return TRUE;
100+
}
101+
}
102+
}
103+
104+
}

0 commit comments

Comments
 (0)