Ahoy StackOverflow,
Я столкнулся с этой проблемой в своем проекте: короче, из того, что я собрал, является то, что PHP script, вызываемый через AJAX, неправильно регистрирует переменные SESSION, которые были установлены в верхней части index.php
стр. Сначала я предположил, что это произошло из-за блокировки сеанса, поэтому я пошел дальше и добавил session_write_close()
, однако это не устранило проблему.
Эта проблема возникает только около 25% времени после начала нового пользовательского сеанса (т.е. когда пользователь входит в систему).
Я пошел вперед и удалил 90% кода, чтобы получить ошибку до минимального минимального кодирования, необходимого для воспроизведения.
Плохой результат Firebug через ajax.php
Ожидаемый результат Firebug через ajax.php
Примечание. Оба результата показывают возврат индекса print_r($_SESSION)
как Array ( [userid] => 3724 [trialstatus] => 1 [trialtcompletions] => 0 [userlevel] => 5 )
, который позволяет мне знать, что проблема не связана с тем, что сеанс установлен на индексной странице.
Кто-нибудь знает исправление (возможно, даже не кодовое, а может быть, и настройку сервера), которое правильно разрешит script через AJAX правильно обращаться к переменной сеанса?
Сценарий тестирования для воспроизведения
- Удалить все файлы cookie для домена
- Загрузите страницу (макс. 2 раза). Проблема не возникает после двух перезагрузок.
- Если плохой результат не отображается, повторите шаги.
index.php
<?php
if (session_status() === PHP_SESSION_NONE) session_start();
if (!isset($_SESSION['userid']))
{
$_SESSION['userid'] = 3724; //$login['AccountID'];
}
$_SESSION['trialstatus'] = "12";
$_SESSION['trialtcompletions'] = "12";
$_SESSION['userlevel'] = "12";
session_write_close();
print_r($_SESSION);
?>
<!DOCTYPE html><html><head><script src="./js/jquery.min.js"></script>
<script>
function loadStage(step,input,callback){
$.ajax({
type: "POST",
url: "./ajax.php",
data: { step: step, input: input },
dataType: "JSON",
timeout: 5000,
success: function(data){
if(data !== false){
callback(data);
}
}
});
}
$(document).ready(function(){
startLoadingSequence();
});
function startLoadingSequence(skipped){
loadStage(1,skipped,function(data){});
}
</script>
</head></html>
ajax.php
<?php
if (session_status() === PHP_SESSION_NONE) session_start();
print_r($_SESSION);
if (!isset($_SESSION['userid']))
{
die(json_encode(array(
"error",
"You must be logged in to view report data."
)));
}
?>
По запросу:
Читать комментарии для дополнительной информации