PHP / Smarty - случайная потеря данных сеанса между 2 страницами - PullRequest
1 голос
/ 22 июня 2011

У меня самая странная проблема с PHP.Я постараюсь быть действительно исчерпывающим, потому что каждая деталь может иметь значение.

У меня есть 3 страницы PHP, и их HTML генерируется с использованием Smarty.Все они вызывают session_start() наверху.

  • первая страница может быть тяжелой для загрузки, она отображает большое количество кликабельных картинок, которые являются предварительными просмотрами сложных объектов PHP
  • , есливыбирается картинка, которая ведет на вторую страницу с определенным URL-адресом. На этой странице будет сгенерирован объект PHP, связанный с информацией об URL-адресе (поэтому для этой страницы не требуется информация с предыдущей страницы. Если вы копируете и вставляете этот URL в любое времяэто будет работать).Этот объект будет сохранен в $_SESSION с уникальным идентификатором.
  • третья страница включена в качестве img src в HTML-код второй страницы (сгенерированный с помощью Smarty).Это страница PHP, имеющая идентификатор сеанса объекта в параметре URL и считывающая информацию об объекте в $ _SESSION, создающая предварительный просмотр изображения и превращающаяся в изображение с заголовком ('Content-type: image / jpeg').

Подводя итог: тяжелая первая страница => вторая страница создает и сохраняет объект PHP на $_SESSION => третью страницу, включается в HTML-код второй страницы, ищет этот объект и создает предварительный просмотр.

Проблема в том, что иногда эта третья страница пытается загрузить объект в $_SESSION, а его просто нет!

Некоторые факты:

  • проблема никогда не возникает, когдавторая страница загружается как автономная с собственным URL-адресом
  • проблема возникает случайным образом, когда тяжелая первая страница начинает загружать изображения, и мы яростно нажимаем на одну из первых, чтобы появиться
  • Какова бы ни была ситуация, если я дам свои $_SESSION переменные в самом конце второй страницы, я ВСЕГДА смогу увидеть сгенерированный объект в моей сессии

Так что яКажется, проблема находится между самым концом второй страницы и началом третьей, но все это связано с деятельностью первой!Все, что я знаю, это то, что это связано с быстрой навигацией между страницами.

Я перепробовал почти все:

  • session_write_close() везде, где это возможно (в конце моих страницдо / после показа smarty, затем в начале перед session_start())
  • добавьте exit() в конце моих сценариев
  • даже sleep(1) в начале третьего в случае сеансаоперация закрытия требует больше времени

Ничего не работает.У меня больше нет подсказок ... Может быть, Smarty?Может быть, какое-то странное поведение сеанса PHP с именем bug # 4454 где-нибудь?

Заранее большое спасибо за помощь в этом.

Редактировать: кусок кода после serialize() chat

/* ===== Page2.php ===== */

/*creating object $card and setting some values ...*/

/*calling the function that gives the card preview*/
$assigns['front'] = $card->getPreviewURL();

/*other stuff ... assign $assigns to smarty ... etc*/


/* ===== Card object class ===== */

function getPreviewURL()
{
  $_SESSION['products'][$this->getObjectId()] = serialize($this);
  $url = '/page3.php?s='.$this->getObjectId();
  return $url;
}


/* ===== Page2.html ===== */

img src="{$front}" alt="toto"


/* ===== Page3.php ===== */

/*getting id value and reading session*/

if(!empty($_GET['s'])) {
  session_write_close();
  $session = new Session;
  if(!empty($_SESSION['products'][$_GET['s']])) {
     $product = unserialize($_SESSION['products'][$_GET['s']]);
  }
  else {
     log('$_SESSION[products]['.$_GET['s'].'] does NOT exist');
     header("Status: 404 Not Found");
     exit;
  }
}

и когда возникает ошибка, я получаю:

page2.php debug log :
Session value : [o20aee110e0853e74da4d17c9b7ab3075]=>O:8:"Postcard":19:{s:4:"tmpl";O:16:"PostcardTemplate":20:{s:2:"id";s:3:"152";s:2:"or";i:0;s:3:"ord";s:2:"14";s:11:"description";s:0:"" ... etc
page3.php debug log :
$_SESSION[products][o20aee110e0853e74da4d17c9b7ab3075] does NOT exist

1 Ответ

1 голос
/ 22 июня 2011

Возможно, проблема в том, что PHP пытается десериализовать ваш объект, но не может найти определение класса.

Вы можете сделать одну из следующих двух вещей:

serialize () объект вручную перед его помещением в сеанс и unserialize () после загрузки определения класса.

Или: используйте автозагрузку .

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