2010-08-13 147 views
29

我在我的网站上使用php会话,它似乎是随机间隔“消失”。我不知道是否由于不活动或者我的代码出现问题而超时,但是有什么方法可以控制它们何时到期的会话?PHP会话超时太快

像我可以把东西放在我的代码或改变php.ini文件中的东西?

更新-所以只需在这里更新,我切换主机和神奇的会议开始工作。我不知道什么是错,但显然他们不想正常工作。

+2

你会在这里找到你的答案:http://stackoverflow.com/questions/1516266/how-long-will-my-session-last/1516284 – svens 2010-08-13 12:02:47

+2

这真是太棒了谢谢。实际上,这最终变得非常有帮助:http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960 – jefffan24 2010-08-13 12:12:43

+1

这甚至是更真棒,谢谢:) – svens 2010-08-13 12:18:32

回答

42

随机过期是几个应用程序共享的会话数据目录的典型症状:时间最短的那个可能会从其他应用程序中删除数据。原因:

  1. 默认情况下,PHP会将会话文件存储在系统临时目录中。
  2. 的内置文件处理程序不跟踪谁拥有什么会话文件(它只是匹配文件名与会话ID):

    Nothing bug good old files

我的建议是,你配置一个私人定制会话目录为您的应用程序。这可以通过session_save_path() function或设置session.save_path configuration directive完成。请检查您的框架的文档,了解如何在您自己的代码库中执行此操作的确切详细信息。

+0

您是否打算在每一页上插入? – JM4 2013-02-07 23:07:13

+3

@ JM4 - 查看[include](http://php.net/include)系列语句。 – 2013-02-08 08:05:17

+0

我明白包括和要求。如果OP有数百或数千页,这将是一场噩梦,如果不是不可能的话。查找和替换是可能的,假设所有页面都具有某种基本结构,但似乎仍然是一种非常奇怪的方式。 – JM4 2013-02-14 17:50:48

2

尝试使用这部分代码:

session_start(); 
    $inactive = 600; 
    $session_life = time() - $_SESSION['timeout']; 
    if($session_life > $inactive) { 
    session_destroy(); 
    header("Location: logoutpage.php"); 
    } 
    $_SESSION['timeout']=time(); 
+0

好吧,我有一个图书馆的PHP网页,包含在网站的每一页上,我假设他们登录时我会开始会话超时。我会在库中使用那一点代码,以便每次加载页面时都会更新其活动? – jefffan24 2010-08-13 12:04:40

+0

这会在10分钟不活动后破坏每个会话。删除所有期望的代码的第一行和最后一行,你就会得到真正的答案。 – svens 2010-08-13 12:06:29

+2

对于善良的爱,在使用它们之前测试变量的存在!假设$ _SESSION ['timeout']有效是Bad(TM) – Fake51 2010-08-13 12:36:39

6

你可以用它的技术,使根据您兼容的应用程序。你必须做出一些改变,根据您的系统

// Get the current Session Timeout Value 
$currentTimeoutInSecs = ini_get(’session.gc_maxlifetime’); 

更改会话超时值

// Change the session timeout value to 30 minutes // 8*60*60 = 8 hours 
ini_set(’session.gc_maxlifetime’, 30*60); 
//————————————————————————————– 

// php.ini setting required for session timeout. 

ini_set(‘session.gc_maxlifetime’,30); 
ini_set(‘session.gc_probability’,1); 
ini_set(‘session.gc_divisor’,1); 

//if you want to change the session.cookie_lifetime. 
//This required in some common file because to get the session values in whole application we need to  write session_start(); to each file then only will get $_SESSION global variable values. 

$sessionCookieExpireTime=8*60*60; 
session_set_cookie_params($sessionCookieExpireTime); 
session_start(); 

// Reset the expiration time upon page load //session_name() is default name of session PHPSESSID 

if (isset($_COOKIE[session_name()])) 
    setcookie(session_name(), $_COOKIE[session_name()], time() + $sessionCookieExpireTime, “/”); 
    //————————————————————————————– 
    //To get the session cookie set param values. 

    $CookieInfo = session_get_cookie_params(); 

    echo “<pre>”; 
    echo “Session information session_get_cookie_params function :: <br />”; 
    print_r($CookieInfo); 
    echo “</pre>”; 

一切顺利!!!!

+4

它实际上是这样做的。你可能正在考虑cookie过期。 – 2010-08-25 08:07:58

12

Debian使用cron作业以安全方式自动使会话过期。如果您使用的是Debian,请查看/etc/cron.d/php5。

+0

Ubuntu也有'/etc/cron.d/php',它使用'/etc/php/7.0/fpm/php.ini'中的'session.gc_maxlifetime'来从'/ var/lib/php/sessions中删除会话'。 – 2016-10-20 16:46:21