请帮助这个问题一直让我发疯,我觉得我到处都在研究并且没有答案。
问题描述
我正在使用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开发者。我可能在上面的代码中做什么/怎么做错了很多错误。任何建设性的批评和与改进的联系也都受到赞赏。