English 中文(简体)
PHP 丢失会话数据 - > 会话文件被太快地删除
原标题:PHP lose Session Data -> Session Files are deleted too quickly

我陷入了一个 $_SESSION 问题,而 $_SESSION 正在随机丢失数据。

我有一份有不同网页的表格,用户有具体时间浏览所有网页。

所以我在第一页上设置了一个会话变量, 并检查其他变量。

< 加强> start.php

 <?php
    session_start();  

    //Set Variable for Starting application
    if (!isset($_SESSION[ STARTED ])){
        $_SESSION[ STARTED ] = time();
    }

< 加强>app_init.php

<?php
session_start();

if ((!isset($_SESSION[ STARTED ])) || (time() - $_SESSION[ STARTED ] > MAX_TIMELIMIT)) {
    echo  <!-- st:  .$_SESSION[ STARTED ]. --> ;
    // Started Variable is not set or timelimit is over.
    session_destroy();   // destroy session data in storage
    session_unset();     // unset $_SESSION variable for the runtime
    showTimeout( 0 );   //  show timeout
}

<强 > 启动页面后:

<?php

// get basic settings for applications 
require_once (MODEL_PATH. /app_init.php );

整个系统对本地安装、 开发服务器和测试服务器运作良好。 在生产服务器上, 我在不同的时间得到一个超时, 时间从 30 秒到 10 分钟不等 。 MAX_ TIMELIMIT < / code> 是 20 分钟 。 在这种情况下, $_ SESSION[STAMED] 总是空的。 在其它环境中, 它设置正确, 即使超时时间在 20 分钟后 。

Additonal 信息 :

  • It doesn t matter if I try to reach the next page or if I simply reload the actual page, I always get the timeout.
  • I already checked php.ini on any environment -> session.save_path is correctly set, session.cookie_lifetime is 0 and session.gc_maxlifetime is 1440
  • Diskspace is fine (> 22 GB free)
  • Every File is on the same server and has the same url (except the last part wich specifies the step of the form. Looks like this:
    host/some/path/calc -> host/some/path/form -> host/some/path/summary -> host/some/path/send
  • The session is set on the calc page and the timeout can happen on every page (calc, form, summary)
  • I got the php.ini from production server and took it into my local workspace. After changing some paths (extensions-path, session.save_path, tmp-path) it worked very well on my local installation.
  • Protocol is an all pages the same
  • To recreate the session (via $tmp and session_destroy(), session_create()) did not help
  • Single Frontend, no Loadbalancer (simply one apache)
  • Session Files are deleted somehow

在增加一些产出和重新测试后,我得到以下信息:

  • I load the Page (first step)
  • I go through the form to any step (calc / form / summary)
  • 当页面被装入 $_SESSION

    array ( STARTED => 1338298801, S_SID_ => 41554681145546 , S_LC_ => de , version_testing => 1, )

  • 我每30秒重新上传一页

  • 至少3分钟后(也可能是30秒)我得到超时, $_SESSION 是:

    array ( )

  • 如果我在第一个页面上尝试这个, 我会在 $_SESSION 中找到一个新的值, 因为会话数据是空的, 自动新设置 。

  • 记住:在测试/Dev环境中,会话数据仍然存在,甚至超时20分钟后也会发生。

  • 更改会话。 saave_ path 似乎首先有效( 会话至少持续24分钟 ) 。 但一小时后, 问题还是一样。 没有会话持续时间超过4分钟 。

Problem found (but no solution yet)
Today I got Access to Production-Server and I found out, the folder with Session-Data is cleaned up after 3-5 minutes. No file there has a timestamp older than 3 minutes. As mentioned before, PHP is correctly set (GC lifetime), and I didnt found any windows job, or something similar what is deleting these files. As PHP.ini is set correctly, I ll try to handle the session via database.

谢谢你的帮助

最佳回答

在这种特定情况下,什么是可行的:

另外一个网站是同一服务器上但另一个虚拟主机上的主机。 这个网站使用一个“ init.php ”, 每一个请求都会被调用。 它包含一条线, 将 gc_ maxlivertime 设置为 0, 然后开始一个会话 。 因此, 如果有需要, 所有会话数据都会被第二个网站随机清除 。

在测试和Dev测试上,这不是一个问题, 因为这两个环境没有太多使用...

问题回答

这是一个常见的行为,当 PHP 网站在 < strong > 多个前端以负载平衡器 < / strong > 托管时,我多次看到。默认情况下, PHP 文件系统中的 PHP 存储会话, 取决于您是哪个前端, 您开始了一个或另一个会话 。

简单的解决办法是将您的会话存储到数据库中, 即使我对负载平衡器错了, 您也应该尝试直接在文件系统上读取会话数据, 检查到底发生了什么( PHP 删除了数据吗? 数据是否还在这里, 但生成了另一个会话符号? 等等 ) 。

乍一看(没有更多信息),看来你的会议也许在时间真正开始之前就已经开始了。 这无疑会造成这个问题。 如果问题可能是这样的话,请尝试一下。

$tmp = $_SESSION;
session_destroy();
session_start();
$_SESSION = $tmp;
$_SESSION[ started ] = time();

另外,如果您正在访问子域或类似区域, 您的会话将不存在。 它只存在于设定时的确切域名 。

提供更多信息也许也有用。 问题所在的 Urls 页面。 在页面上添加几个 var_ dump( $_ session) < /code >, 并查看它所输出的内容。 当您注意到一个变化时, 请找出变化的地点和原因 。





相关问题
why the session in iis automatically log out?

I used iis6, and when i called a function Directory.delete(), the all the session relate this website will be logged out. and i debugged the website, i found no exception. any one have ideas on this ? ...

Check session from a view in CodeIgniter

What is the best way to check session from a view in CodeIgniter, it shows no way in their user guide, otherwise I will have to make two views on everything, which is kinda weird...still a newbie to ...

Can I get the size of a Session object in bytes in c#?

Is it possible to get the size(in bytes) of a Session object after storing something such as a datatable inside it? I want to get the size of a particular Session object, such as Session["table1"], ...

提供严格分类的出席会议物体

提供严格分类的与会机会的最佳方式是什么? 我正计划转而选择矩阵,这正在促使汇编者抱怨我的幻觉方案拟订方法......

PHP Session is not destroying after user logout

I m trying to create an authentication mechanism for my PHP Application and I m having difficulty destroying the session. I ve tried unsetting the authentication token which was previously set within ...