2010-11-01 2 views
0

У меня возникла очень странная проблема с переменными сеанса PHP. Основываясь на идентификаторе сеанса, похоже, что в одном сеансе будут двойные переменные, которые, естественно, невозможны.PHP: аутсинхронные или параллельные массивы переменных сеанса внутри сеанса

Проблема заключается в том, что переменная сеанса «quote» должна оставаться такой же, как и форма на странице, которая перезагружает страницу. Переменная $ _SESSION ['quote'] устанавливается только в том случае, если она не определена, что происходит в первых двух перезагрузках, как показано ниже.

код Debug:

echo "\n Current session id: ".session_id(); 
    echo "\n _SESSION['quote']: ".$_SESSION['quote']; 
    $_SESSION['counter'] = isset($_SESSION['counter'])? $_SESSION['counter'] +1 : 0; 
    echo "\n _SESSION['counter']: ".$_SESSION['counter']; 

Output when page is reloaded(form submitted): 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: ; 
$_SESSION['counter']: 0; 
set _SESSION['quote']: 984; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: ; 
$_SESSION['counter']: 0; 
set _SESSION['quote']: 985; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 985; 
$_SESSION['counter']: 1; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 985; 
$_SESSION['counter']: 2; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 984; 
$_SESSION['counter']: 1; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 985; 
$_SESSION['counter']: 3; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 984; 
$_SESSION['counter']: 2; 

Эта проблема происходит с Firefox и IE. Любые советы или советы будут высоко оценены. Спасибо заранее.

--- EDIT --- Добавлено echo serialize ($ _ SESSION); как было предложено.

<?php session_start(); 
echo "\nSerialized data at begin of page: "; 
echo serialize($_SESSION); 

echo "\n Current session id: ".session_id(); 
echo "\n _SESSION['quote']: ".$_SESSION['quote']; 
$_SESSION['counter'] = isset($_SESSION['counter'])? $_SESSION['counter'] +1 : 0; 
echo "\n _SESSION['counter']: ".$_SESSION['counter']; 

ВЫВОД:

Initial loading of page: 
    Serialized data at begin of page: a:0:{} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 
    $_SESSION['counter']: 0 
    ... 
    Serialized data at end of page: a:1:{s:7:"counter";i:0;} 


Page 1. reload by form submit: 
    Serialized data at begin of page: a:0:{} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 
    $_SESSION['counter']: 0 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:0;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 


Page 2. reload by form submit: 
    Serialized data at begin of page: a:1:{s:7:"counter";i:0;} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 
    $_SESSION['counter']: 1 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:1;s:8:"quote";i:1024;s:9:"quotedate";s:10:"2010-11-18";} 


Page 3. reload by form submit: 
    Serialized data at begin of page: a:3:{s:7:"counter";i:0;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 1023 
    $_SESSION['counter']: 1 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:1;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 

Page 4. reload by form submit: 
    Serialized data at begin of page: a:3:{s:7:"counter";i:1;s:8:"quote";i:1024;s:9:"quotedate";s:10:"2010-11-18";} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 1024 
    $_SESSION['counter']: 2 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:2;s:8:"quote";i:1024;s:9:"quotedate";s:10:"2010-11-18";} 

Page 5. reload by form submit: 
    Serialized data at begin of page: a:3:{s:7:"counter";i:1;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 1023 
    $_SESSION['counter']: 2 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:2;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 

Я надеюсь, что это показывает, моя проблема лучше, чем неясное оригинальное описание. Простите за это. На этот раз «два параллельных» массива переменных сеанса, если таковые могут быть, кажутся активными один за другим. Иногда другой активен несколько раз, а потом еще ...

--- EDIT ---

+1

Это противоречит. Предоставьте более подробную информацию. Вывод, похоже, не тот, который должен быть получен из вашего кода отладки. Двойная проверка. –

+0

Да, и откуда берется «цитата»? Почему он увеличивается? –

+0

Вывод - это именно то, что выходит, только ';' добавленный мной, так как без этого все пошло в одну строку в моем сообщении, и запись «set_SESSION» не была включена, поскольку она последней на странице. Это нелогично, журнал хорошо показывает проблему. @Pekka: 'quote' устанавливается, если $ _SESSION ['quote'] не задано, и в этом случае предполагается увеличение. Проблема в том, что его не следует увеличивать, поскольку он уже установлен в этом сеансе. – Laowai

ответ

0

Я создал простой скрипт для имитации проблемы, когда я сбросить переменные сессии в начале и в конце страницы. Страница имеет одну кнопку, которая обновит страницу и в начале страницы будет счетчиком, который хранится в переменных сеанса. Обнаружение заключалось в том, что при быстром нажатии все работает хорошо, но если вы ожидаете> 10, то переменные сеанса пустые (переменная счетчика), а после этого при нажатии кнопки увеличивается счетчик исходного счетчика или параллельного счетчика переменных сеанса.

Я также выделил проблему на сервере, где размещен оригинальный проблемный веб-сайт. Проблема не может быть воспроизведена на локальном хосте и другом сервере, который я тестировал. Таким образом, вывод заключается в том, что некоторая конфигурация на сервере неверна или имеется ошибка в PHP 5.2.9 или какой-либо другой компонент.

Спасибо всем за ваши комментарии.

0

Все странно, где же «набор _SESSION» взялось? работает ли сценарий на обоих сообщениях и получает?

убедитесь, что он достигает session_start() для обоих методов.

+0

Журнал «set_SESSION» не был включен в мое описание, и он выполнен в случае, если $ _SESSION ['quote'] не задан, который является начальным. Самое странное, что он выполняется дважды, и, как вы можете видеть из «счетчика», все, кажется, установлено дважды, но имеет разные значения. Да, сценарий имеет функциональность «POST» и «GET», хотя и не связан с переменной «quote» session. 'session_start()' - первая строка исходного файла. – Laowai

+0

Пожалуйста, не сосредотачивайтесь слишком много на том, что это соответствие журналу предоставленному коду или что такое «цитата», если вы чувствуете, что это запутывает или что-то не хватает. Вместо этого вы можете объяснить, как переменная «counter» может иметь такие значения в одном сеансе? Он не используется и не изменяется нигде, кроме как в предоставленном коде ... – Laowai

+0

Трудно отследить ошибку (?), А расхождение между журналом и кодом делает его еще сложнее. Тем не менее, я бы предложил вам поставить >> echo serialize ($ _ SESSION) наверху и конец вашего скрипта, чтобы лучше следовать exec. Ошибка колпачка? Посмотреть источник? (chrome reloads page ..) – Teson

0

лаовай, рад помочь,

Во-первых, ваш код ошибки:

isset($_SESSION['counter']) ? $_SESSION['counter'] +1 : 0; 

должен быть

isset($_SESSION['counter']) ? $_SESSION['counter']++ : $_SESSION['counter'] = 0; 

Во-вторых, если вы до сих пор производства-Server-ошибок, проверка access-log для отслеживания любых непреднамеренных запросов (из jQuery или что-то еще), испортивших ваш контроллер (?) - запросы.

В-третьих, я предлагаю вам прочитать ваши данные $ _SESSION ONCE сверху и скопировать в обычный $ var и в конце скрипта записать обратно в $ _SESSION. $ _SESSION чаще всего являются файлами, и на серверах с высокой нагрузкой могут возникать странные вещи.

$sesscopy = $_SESSION; 
//do everything... 
//now done... 
$_SESSION = $sesscopy; 

С уважением, /т Eriksson

Смежные вопросы