PHP: внешние или параллельные массивы переменных сеанса внутри сессии - PullRequest
0 голосов
/ 01 ноября 2010

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

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

Код отладки:

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 --- Добавлена ​​сериализация эха ($ _ 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 ---

Ответы [ 3 ]

0 голосов
/ 03 ноября 2010

Laowai, рад помочь,

Сначала в вашем коде есть ошибки:

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

должно быть

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

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

В-третьих, я бы посоветовал вам прочитать ваши данные $ _SESSION ОДИН РАЗ в верхней части и скопировать в обычный $ var, а в конце сценария записать обратно в $ _SESSION. $ _SESSION чаще всего файлы, и на серверах с высокой нагрузкой могут происходить странные вещи.

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

С уважением, / т Эрикссон

0 голосов
/ 03 ноября 2010

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

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

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

0 голосов
/ 01 ноября 2010

Все странно, откуда берется "set _SESSION"? скрипт действует как на запись, так и на получение?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...