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