1

当用户单击链接并进入下一页时,它会启动一个长话短说的会话,告诉数据库使该链接不可用。在数据库重置使链接再次可用之前,他们只有 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 分钟。

4

3 回答 3

2

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

在受限页面的顶部:

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 调用。

监听器.php

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

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

于 2013-03-21T01:51:04.423 回答
0

我想让你怎么想

蜱虫

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

register_tick_function -- 注册一个函数以在每个刻度上执行

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

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

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() 不应与线程网络服务器模块一起使用。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'));

    ?>
于 2013-03-21T01:44:55.460 回答
-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");
?>

我不擅长日期/时间,所以你可能必须修复这个代码,但这个概念是这个答案的主要意图。

于 2013-03-21T01:43:20.450 回答