У меня самая странная проблема с 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