PHP会话数据随机获取删除

时间:2016-06-16 17:21:33

标签: javascript php ajax session

请帮助这个问题一直让我发疯,我觉得我到处都在研究并且没有答案。

问题描述
我正在使用WAMP的PHP,MySQL,Apache为我的公司创建一个Intranet Web应用程序 我遇到了一个问题,即服务器上的$ _SESSION数据被随机删除,没有明显的原因(我确定原因,我只是无法抓住它!)。登记/> 我所拥有的是显示的每个HTML页面中包含的 index.js 文件。这个JS文件包含以下代码:

var refreshTime = 60000;    // 1 minute = 1000ms/1s * 60s/min = 60,000
//  Function called every refreshTime interval
window.setInterval( function() {    
    //  AJAX call to refreshSession.php simply calls session_start() in PHP
    $.ajax({
        cache: false,
        type: "GET",
        url: rootWebHostURL + "php/refreshSession.php",
        success: function(data) {
            console.log("Session refreshed via AJAX call in index.js");
            console.log("Dumping RAW JSON DATA");
            console.log(data);

            testobj = jQuery.parseJSON(data);
            console.log("Dumping JSON PARSED DATA"); 
            console.log(testobj);

            if ( testobj.sessionIsEmpty )
            {
                alert('SESSION DATA IS EMPTY');
            }
        }
    });
}, refreshTime );

此部分每1分钟向服务器发出一次AJAX调用。调用的PHP代码调用 session_start()来刷新会话,并将其上次访问时间保持在 gc_maxlifetime (我已设置为3600s或1小时)在 php.ini 文件中。我最近修改了代码,以便在会话数据被删除时发出浏览器警报。

refreshSession.php 代码如下所示:

session_start();
$arrayForAJAX = session_get_cookie_params();
$arrayForAJAX['id'] = session_id();

$sessionLog = fopen('C:\\...\\Desktop\\AAPEC Project\\Log\\session_log_00.txt', 'a+');

$dateNow = date('Y-m-d H:i:s');

$textToWrite = $dateNow . PHP_EOL . '===================' . PHP_EOL;

$sessionDataString = var_export( $_SESSION, true );

$textToWrite .= $sessionDataString . PHP_EOL . '==========================================' . PHP_EOL . PHP_EOL;

fwrite($sessionLog, $textToWrite);

$arrayForAJAX['sessionIsEmpty'] = false;
if ( empty($_SESSION) )
{
    $arrayForAJAX['sessionIsEmpty'] = true;
}

echo json_encode( $arrayForAJAX, JSON_FORCE_OBJECT);

我最近在refreshSession.php中做的是每次从AJAX调用refreshSession.php时,将$ _SESSION变量的内容写入带有时间戳的文件。查看此日志的内容'文件如下。

2016-06-16 09:24:15
=================== array (   'workingStatus' => 'in_process',   'currentpage' => 'datacapture.tpl',   'visitedpages' =>    array (
    0 => 'stocknumber.tpl',
    1 => 'preflight.tpl',
    2 => 'general.tpl',
    3 => 'pxeactions.tpl',
    4 => 'timezone.tpl',
    5 => 'options.tpl',
    6 => 'datacapture.tpl',   ),   'stocknumber.tpl' =>    array (
    'stocknum' => '12345678',
    'tenDigitStockNumber' => '0012345678',   ),   'operationType' => 'new',   'preflight.tpl' =>    array (
    'hardware_class' => '0',
    'tot_sys_memory' => '1',
    'installed_os' => '0',
    'pxe_boot_method' => '0',   ),   'general.tpl' =>    array (
    'engineer' => 'Bill Hodges',
    'company_name' => 'af',
    'parent_pn' => 'afds',
    'network_location' => 'Images',
    'support_file_directory' => 'Images\\12345678',   ),   'pxeactions.tpl' =>    array (
    'pxe_boot_action' => '0',
    'pxe_boot_mode' => '0',   ),   'timezone.tpl' =>    array (
    'timezone' => '-7',   ),   'options.tpl' =>    array (
    'datacapture' => 'datacapture.tpl',
    'virusscan' => 'virusscan.tpl',   ),   'optionpages' =>    array (
    0 => 'datacapture.tpl',
    1 => 'virusscan.tpl',   ), )
==========================================

2016-06-16 09:25:15
=================== array (   'workingStatus' => 'in_process',   'currentpage' => 'datacapture.tpl',   'visitedpages' =>    array (
    0 => 'stocknumber.tpl',
    1 => 'preflight.tpl',
    2 => 'general.tpl',
    3 => 'pxeactions.tpl',
    4 => 'timezone.tpl',
    5 => 'options.tpl',
    6 => 'datacapture.tpl',   ),   'stocknumber.tpl' =>    array (
    'stocknum' => '12345678',
    'tenDigitStockNumber' => '0012345678',   ),   'operationType' => 'new',   'preflight.tpl' =>    array (
    'hardware_class' => '0',
    'tot_sys_memory' => '1',
    'installed_os' => '0',
    'pxe_boot_method' => '0',   ),   'general.tpl' =>    array (
    'engineer' => 'Bill Hodges',
    'company_name' => 'af',
    'parent_pn' => 'afds',
    'network_location' => 'Images',
    'support_file_directory' => 'Images\\12345678',   ),   'pxeactions.tpl' =>    array (
    'pxe_boot_action' => '0',
    'pxe_boot_mode' => '0',   ),   'timezone.tpl' =>    array (
    'timezone' => '-7',   ),   'options.tpl' =>    array (
    'datacapture' => 'datacapture.tpl',
    'virusscan' => 'virusscan.tpl',   ),   'optionpages' =>    array (
    0 => 'datacapture.tpl',
    1 => 'virusscan.tpl',   ), )
==========================================

2016-06-16 09:26:15
=================== array ( )
==========================================

我在这里剪切文件的内容以节省空间。在第一行之前有大约10+个成功的$ _SESSION数据写入,但是你可以看到最后一次写入是一个空数组。表示没有$ _SESSION数据。我试图在这里使用debug_backtrace()来获取有关PHP在程序中的位置的信息,并确定调用可能导致此问题的脚本/函数。但是,当我在refreshSession.php脚本中尝试使用它时,debug_backtrace()会返回一个空数组。根据我的研究,它表明这是因为refreshSession.php是第一个也是唯一一个被调用的脚本。

为什么?!?!?为什么这段代码会调用10+或更多成功的session_start()并保存$ _SESSION数据,然后随机删除其中一个调用的数据?

我在 php.ini 文件中有以下与会话/ Cookie相关的设置:

session.gc_probability = 1
session.gc_divisor = 1
session.gc_maxlifetime = 3600
session.cookie_lifetime = 0


我意识到,通过我做事的方式,将有效地保持这个会话永远活着,因为我每1分钟刷新一次会话。现在这很好,我只是不希望数据在应用程序中间丢失。

旁注:
我意识到cookie_lifetime = 0会使cookie保持活着状态。在浏览器上直到浏览器关闭。我意识到session.gc_xxx变量的组合将为会话垃圾收集产生1的概率,如果我理解正确将清除未被修改的旧会话'在过去的1小时内(自session.gc_lifetime = 3600s起)。我已经考虑过,甚至开始使用DB为用户管理的会话编写代码,以便给予我更多的控制权,但经过更多的研究,我认为这不是我在这里尝试做的简单任务所必需的。 BR />

我是这方面的新手(最近毕业于BSEE w /计算机信息系统辅修课程,我对这一切的大部分知识来自Google和StackOverflow)并且设法创建了这个Web应用程序,但是我是不是web / php开发者。我可能在上面的代码中做什么/怎么做错了很多错误。任何建设性的批评和与改进的联系也都受到赞赏。

0 个答案:

没有答案