function fs_systest_session() { require_once FS_ABS_PATH . '/php/session.php'; global $FS_SESSION; unset($FS_SESSION); $errors = array(); $res = fs_initialize_session_dir(true); if ($res !== true) { $errors[] = fs_systest_error("fatal", sprintf("Error initializing session directory: %s", $res)); } else { $ok = fs_session_start(null, true); if ($ok !== true) { $errors[] = fs_systest_error("fatal", "Error creating test session"); } else { global $FS_SESSION; $sid = $FS_SESSION['sid']; unset($GLOBALS['FS_SESSION']); $ok = fs_session_start($sid, true); if ($ok !== true) { $errors[] = fs_systest_error("fatal", "Error restoring session : {$ok}"); } } } return $errors; }
/** * Garbage collect stale session. * this is called automatically and perform its operation at most every GC_INTERVAL_SECONDS. */ function fs_session_gc() { $session_initialized = fs_initialize_session_dir(true); if ($session_initialized !== true) { return $session_initialized; } $last_gc = 0; $dir = $GLOBALS['FS_TEMP_DIR']; $fname = "{$dir}/last_gc"; if (file_exists($fname)) { $f = file($fname); if (isset($f[0]) && is_numeric($f[0])) { $last_gc = (int) $f[0]; } } if (time() - $last_gc > GC_INTERVAL_SECONDS) { //echo "running gc</br>"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { if ($filename != 'last_gc' && $filename != '.' && $filename != '..') { $rotten = false; $fn = "{$dir}/{$filename}"; $fd = @fopen($fn, "r"); if ($fd == false) { if (FS_SESSION_DEBUG) { echo "Error opening {$fn}<br/>"; } // error opening the file, assume invalid and (try to) gc it. $rotten = true; } else { $str = fgets($fd); fclose($fd); if ($str == false) { // error reading the file, assume invalid and gc it. $rotten = true; } else { $session = @unserialize($str); if ($session != false) { $accessed = (int) $session['accessed']; //echo "elapsed " . (time() - $accessed) . "<br/>"; $rotten = time() - $accessed >= SESSION_TIMEOUT; } else { if (FS_SESSION_DEBUG) { echo "Error unserialzing {$fn}<br/>"; } // bad file. $rotten = true; } } } if ($rotten) { if (FS_SESSION_DEBUG) { echo "Session GC: unlinking {$filename}</br>"; } if (!@unlink($fn)) { if (FS_SESSION_DEBUG) { echo "Error unlinking {$fn}<br/>"; } } } } } if (fs_is_writable_and_readable($fname)) { $fd = fopen($fname, "w+"); fputs($fd, time()); fclose($fd); } else { return "{$fname} is not writeable by PHP user"; } } }