示例#1
0
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;
}
示例#2
0
文件: session.php 项目: alx/blogsfera
/**
 * 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";
        }
    }
}