会话超时和自动重定向

时间:2013-03-21 01:27:21

标签: php session

当用户点击链接并进入下一页时,它会启动一个长话短的会话,告诉数据库使该链接不可用。在数据库重置之前,他们只有30分钟的时间来完成他们应该在此页面上执行的操作。再次使链接可用..我怎样才能使用户不能坐在页面上并保持链接不可用或单击刷新以保持同一页面?

基本上,有没有办法可以自动将用户重定向到另一个页面,而不用点击任何东西?无论如何,当会话到期时,页面应该将它们重定向到另一个页面。

我不认为我可以使用此,因为我希望重定向取决于会话何时到期。

header("Refresh: 60; Location: /path/somepage.php");

任何帮助都会非常有用!

**编辑,30分钟在会话中定义。所以关于会议......

$now = time();

$_SESSION['start'] = time(); // taking now page start time
$_SESSION['expire'] = $_SESSION['start'] + (1 * 60) ; // ending a session in 30

$outOfTime = $_SESSION['expire'] - $_SESSION['start'];

if($now > $_SESSION['expire'])
{

    header("Refresh: $outOfTime ; Location: /path/redirect.php");

}

会话计时器设置为1分钟以进行测试。

3 个答案:

答案 0 :(得分:2)

因为页面的硬刷新是不可取的(对用户来说也不好!),你必须有javascript来定期查询报告页面上剩余时间的监听器,或者unix datetime该页面的到期日。

在受限制页面的顶部:

session_start();
if (!isset($_SESSION['page_expiry']) || time() < $_SESSION['page_expiry'])
    $_SESSION['page_expiry'] = time() + (60 * 30);
    // render page
} else {
    echo "time's up!";
}

在页面内部将是javascript,可能每隔30秒对以下 listener.php 进行ajax调用。

listener.php

session_start();
if (time() > $_SESSION['page_expiry']) echo 'false';
else echo true;

如果ajax调用返回false,则将它们踢出页面。

答案 1 :(得分:0)

我希望你想到的任何方式

  

tick是声明块中解析器执行的每N个低级语句发生的事件。在声明块的指令部分中使用ticks = N指定N的值。 使用register_tick_function()指定每个tick上发生的事件。有关详细信息,请参阅下面的示例。请注意,每个tick都可能发生多个事件。

  

register_tick_function - 注册一个函数以便在每个函数上执行   蜱

Description
bool register_tick_function ( callback function [, mixed arg [, mixed ...]] )

注册func命名的函数,以便在调用tick时执行。此外,您可以将包含对象和方法的数组作为函数传递。

  

register_tick_function()示例

<?php
declare(ticks=20);
// using a function as the callback
register_tick_function('my_function', true);
// using an object->method
$object = new my_class();
register_tick_function(array(&$object, 'my_method'), true);
?>

警告 register_tick_function()不应与线程Web服务器模块一起使用。 Ticks在ZTS模式下无效,可能会导致您的网络服务器崩溃。

我刚刚从我的机架上复制,希望它可以帮助我们任何一个社区

<?php 
     /**
     *  ************************ NOTICE ***********************************
     *
     *      The use of Timers WILL slow down your script execution time.
     *      By how much is determined by the user implementation.
     *
     *  *******************************************************************
     *
     *  This pacakge contains one class for handling timers in PHP
     *  and enables the handling of callback functions at given intervals
     *  in microseconds (NOT milliseconds like javascript), as well as 
     *  removing said functions from the stack of callable functions.
     *  
     *  The class is dependent on the PHP language construct declare(ticks=N);
     *  where N represents how many "tickable statements" that get processed
     *  before a registered tick function is called and MUST be declared in the top level script, 
     *  not an included file in order to be effective. 
     *
     *  @see http://us.php.net/manual/en/control-structures.declare.php#control-structures.declare.ticks
     *  
     *  The value of N determines
     *  1) how close to perfect accuracy the timers are (probably never be perfect though)
     *  2) how fast the script will be processed
     *  If N == 1 the script will be very close to perfectly accurate, but will run very slow
     *  but if N is set TOO high (like 10000) it may not be very effective or accurate.
     *  It is up to the user to determine what this number should be for their script.
     *
     *  The package also includes 4 functions for simplifying calls to the static methods of the class:
     *      -- setTimeout, setInterval, clearTimeout, clearInterval

    /**
     *  Just for simplifying the Timers::setTimeout method
     *
     *
     *  @param callable | string $func
     *  @param integer $microseconds - remember this is microseconds NOT milliseconds
     *
     *  @return integer
     */
    function setTimeout ($func, $microseconds)
    {
        return Timers::setTimeout($func, $microseconds);
    }

    /**
     *  Just for simplifying the Timers::setInterval method
     *
     *
     *  @param callable | string $func
     *  @param integer $microseconds - remember this is microseconds NOT milliseconds
     *
     *  @return integer
     */
    function setInterval ($func, $microseconds)
    {
        return Timers::setInterval($func, $microseconds);
    }

    /**
     *  Just for simplifying the Timers::clearTimeout method
     *
     *
     *  @param integer $interval - an integer representing the one returned from a call to setTimeout()
     *
     *  @return boolean
     */
    function clearTimeout ($func, $microseconds)
    {
        return Timers::setTimeout($func, $microseconds);
    }

    /**
     *  Just for simplifying the Timers::clearInterval method
     *
     *
     *  @param integer $interval - an integer representing the one returned from a call to setInterval()
     *
     *  @return boolean
     */
    function clearInterval ($interval)
    {
        return Timers::clearInterval($interval);
    }

    /**
     *  This class contains a series of static properties and functions
     *  that enable the creation and execution of timers
     *
     *  @author Sam Shull
     */
    class Timers
    {
        /**
         *  An array of the arrays that represent
         *  the timer information used by Timers::tick
         *
         *  @access private
         *  @staticvar array
         */
        private static $timers = array();

        /**
         *  Tracker of timers
         *
         *
         *  @access private
         *  @staticvar integer
         */
        private static $numTimers = 0;

        /**
         *  An array of the arrays that represent
         *  the interval information used by Timers::tick
         *
         *  @access private
         *  @staticvar array
         */
        private static $intervals = array();

        /**
         *  Tracker of intervals
         *
         *
         *  @access private
         *  @staticvar integer
         */
        private static $numIntervals = 0;

        /**
         *  Used for debugging
         *
         *
         *  @access private
         *  @staticvar integer
         */
        //private static $ticks = 0;

        /**
         *  A utility method called after N number of ticks by the engine
         *  that checks each timer and interval to see if the desired 
         *  number of microseconds have passed and executes the function 
         *  when appropriate
         *
         *  @static
         *  @return void
         */
        public static function tick ()
        {
            //++self::$ticks;

            $time = self::microtime();

            foreach (self::$timers as $position => $timer)
            {
                if ($time >= $timer['time'])
                {
                    call_user_func($timer['function']);
                    unset(self::$timers[$position]);
                }
            }

            foreach (self::$intervals as $position => $timer)
            {
                if ($time >= $timer['time'])
                {
                    call_user_func($timer['function']);
                    self::$intervals[$position]['time'] = self::microtime() + self::$intervals[$position]['microseconds'];
                }
            }
        }

        /**
         *  A utility method for retrieving the most accurate
         *  microtime available
         *
         *  @static
         *  @return float
         */
        public static function microtime ()
        {
            list($m, $s) = explode(' ', microtime());
            return round(((float)$m + (float)$s) * 1000000);
        }

        /**
         *  A utility method that ensures that all the timeouts have been called
         *  and that calls all the intervals one more time
         *
         *
         *  @static
         *  @return void
         */
        public static function shutdown ()
        {
            foreach (self::$timers as $position => $timer)
            {
                call_user_func($timer['function']);
                unset(self::$timers[$position]);
            }

            foreach (self::$intervals as $position => $interval)
            {
                call_user_func($interval['function']);
                unset(self::$intervals[$position]);
            }

            //print "\nticks: " . self::$ticks;
        }

        /**
         *  Add a function to the be executed after ($microseconds) microsecond
         *
         *  @static
         *
         *  @param callable | string $func
         *  @param integer $microseconds - remember microseconds, not miliseconds
         *
         *  @return integer
         */
        public static function setTimeout ($func, $microseconds)
        {
            if (!is_callable($func))
            {
                if (is_string($func))
                {
                    $func = create_function('', $func);
                }
                else
                {
                    throw new InvalidArgumentException();
                }
            }

            self::$timers[++self::$numTimers] = array(
                                                        'time' => self::microtime() + $microseconds, 
                                                        'function' => $func,
                                                    );

            return self::$numTimers;
        }

        /**
         *  Add a function to the be executed every ($microseconds) microsecond
         *
         *  @static
         *
         *  @param callable | string $func
         *  @param integer $microseconds - remember microseconds, not miliseconds
         *
         *  @return integer
         */
        public static function setInterval ($func, $microseconds)
        {
            if (!is_callable($func))
            {
                if (is_string($func))
                {
                    $func = create_function('', $func);
                }
                else
                {
                    throw new InvalidArgumentException();
                }
            }

            self::$intervals[++self::$numIntervals] = array(
                                                                'time' => self::microtime() + $microseconds, 
                                                                'function' => $func,
                                                                'microseconds' => $microseconds,
                                                            );

            return self::$numIntervals;
        }

        /**
         *  Remove a timeout function from the stack
         *
         *  @static
         *
         *  @param integer $timer
         *
         *  @return boolean
         */
        public static function clearTimeout ($timer)
        {
            if (isset(self::$timers[$timer]))
            {
                unset(self::$timers[$timer]);
                return true;
            }

            return false;
        }

        /**
         *  Remove an interval function from the stack
         *
         *  @static
         *
         *  @param integer $interval
         *
         *  @return boolean
         */
        public static function clearInterval ($interval)
        {
            if (isset(self::$intervals[$interval]))
            {
                unset(self::$intervals[$interval]);
                return true;
            }

            return false;
        }
    }

    /**
     *  Register these methods in order to perform polling a specific intervals
     *  that are set by the user
     */
    register_tick_function(array('Timers','tick'));
    register_shutdown_function(array('Timers','shutdown'));

    ?>

答案 2 :(得分:-2)

您应该有一个系统可以检查会话到期之前的时间,只要用户进入页面并将重定向设置为该长度,该系统就会运行。例如:

<?php
#some code to get expiration date of session. Make sure it is in a datetime object.
#get difference between current time and expiration time:
$timeleft=$expirationTime-new DateTime('now');
header("Refresh: {$timeleft};Location: http://example.com");
?>

我对日期/时间不满意,所以你可能需要修改这个代码,但这个概念是这个答案的主要目的。