可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am creating a session when a user logs in like so:
$_SESSION[\'id\'] = $id;
How can I specify a timeout on that session of X minutes and then have it perform a function or a page redirect once it has reached X minutes??
EDIT: I forgot to mention that I need the session to timeout due to inactivity.
回答1:
first, store the last time the user made a request
<?php
$_SESSION[\'timeout\'] = time();
?>
in subsequent request, check how long ago they made their previous request (10 minutes in this example)
<?php
if ($_SESSION[\'timeout\'] + 10 * 60 < time()) {
// session timed out
} else {
// session ok
}
?>
回答2:
When the session expires the data is no longer present, so something like
if (!isset($_SESSION[\'id\'])) {
header(\"Location: destination.php\");
exit;
}
will redirect whenever the session is no longer active.
You can set how long the session cookie is alive using session.cookie_lifetime
ini_set(\"session.cookie_lifetime\",\"3600\"); //an hour
EDIT: If you are timing sessions out due to security concern (instead of convenience,) use the accepted answer, as the comments below show, this is controlled by the client and thus not secure. I never thought of this as a security measure.
回答3:
Just check first the session is not already created and if not create one. Here i am setting it for 1 minute only.
<?php
if(!isset($_SESSION[\"timeout\"])){
$_SESSION[\'timeout\'] = time();
};
$st = $_SESSION[\'timeout\'] + 60; //session time is 1 minute
?>
<?php
if(time() < $st){
echo \'Session will last 1 minute\';
}
?>
回答4:
<script type=\"text/javascript\">
window.setTimeout(\"location=(\'timeout_session.htm\');\",900000);
</script>
In the header of every page has been working for me during site tests(the site is not yet in production). The HTML page it falls to ends the session and just informs the user of the need to log in again. This seems an easier way than playing with PHP logic.
I\'d love some comments on the idea. Any traps I havent seen in it ?
回答5:
<?php
session_start();
if (time()<$_SESSION[\'time\']+10){
$_SESSION[\'time\'] = time();
echo \"welcome old user\";
}
else{
session_destroy();
session_start();
$_SESSION[\'time\'] = time();
echo \"welcome new user\";
}
?>
回答6:
Byterbit solution is problematic because:
- having the client control expiration of a server side cookie is a security issue.
- if expiration timeout set on server side is smaller than the timeout set on client side, the page would not reflect the actual state of the cookie.
- even if for the sake of comfort in development stage, this is a problem because it won\'t reflect the right behaviour (in timing) on release stage.
for cookies, setting expiration via session.cookie_lifetime is the right solution design-wise and security-wise! for expiring the session, you can use session.gc_maxlifetime.
expiring the cookies by calling session_destroy might yield unpredictable results because they might have already been expired.
making the change in php.ini is also a valid solution but it makes the expiration global for the entire domain which might not be what you really want - some pages might choose to keep some cookies more than others.
回答7:
session_cache_expire( 20 );
session_start(); // NEVER FORGET TO START THE SESSION!!!
$inactive = 1200; //20 minutes *60
if(isset($_SESSION[\'start\']) ) {
$session_life = time() - $_SESSION[\'start\'];
if($session_life > $inactive){
header(\"Location: user_logout.php\");
}
}
$_SESSION[\'start\'] = time();
if($_SESSION[\'valid_user\'] != true){
header(\'Location: ../....php\');
}else{
source: http://www.daniweb.com/web-development/php/threads/124500
回答8:
<?php
session_start();
if($_SESSION[\'login\'] != \'ok\')
header(\'location: /dashboard.php?login=0\');
if(isset($_SESSION[\'last-activity\']) && time() - $_SESSION[\'last-activity\'] > 600) {
// session inactive more than 10 min
header(\'location: /logout.php?timeout=1\');
}
$_SESSION[\'last-activity\'] = time(); // update last activity time stamp
if(time() - $_SESSION[\'created\'] > 600) {
// session started more than 10 min ago
session_regenerate_id(true); // change session id and invalidate old session
$_SESSION[\'created\'] = time(); // update creation time
}
?>