PHP / Smarty - 2页之间的随机会话数据丢失

时间:2011-06-22 16:05:10

标签: php session smarty loss

我正面临着我见过的最奇怪的PHP问题。我会尽量详尽无遗,因为每个细节都可以计算。

我有3个PHP页面,他们的HTML是使用Smarty生成的。他们都在session_start()顶部打电话。

  • 第一页可能很重要加载,它会显示大量可点击的图片,这些图片是PHP复杂对象的预览
  • 如果选择了图片,则会导致第二页显示特定的URL。此页面将生成与URL信息相关的PHP对象(因此,此页面不需要上一页的信息才能工作。如果您复制粘贴这个URL在任何时候都可以工作)。此对象将存储在$_SESSION中,并带有唯一ID。
  • 第三页作为img src包含在第二页的HTML代码中(由Smarty生成)。这是一个PHP页面,在URL参数中包含对象的会话ID,并在$ _SESSION中读取对象的信息,创建它的图像预览并变成带有标题的图像('Content-type:image / jpeg')。

总结: 沉重的第一页=>第二页创建并将PHP对象存储到$_SESSION =>第三页,包含在第二页的HTML代码中,搜索此对象并创建预览。

问题是,有时候,第三页试图加载$_SESSION中的对象并且它不存在!

一些事实:

  • 当第二页作为独立的网站加载时,问题永远不会发生
  • 问题只会在沉重的第一页开始加载图片时随机出现,我们会疯狂地点击其中一个出现
  • 无论情况如何,如果我将$_SESSION变量转储到第二页的最后,我总能在会话中看到生成的对象

所以似乎问题位于第二页的最后和第三页的开头之间,但所有这些都与第一页的活动有关! 我所知道的是,它与页面之间的快速导航相关联。

我几乎尝试过所有事情:

  • session_write_close()无处不在(在智能显示之前/之后的页面末尾,然后是session_start()之前的开头)
  • 在我的脚本末尾添加exit()
  • 如果会话关闭操作需要更多时间,
  • 甚至sleep(1)在第三个开头

没有任何作用。我没有更多的线索......也许是Smarty?也许某些奇怪的PHP会话行为在某处名为bug#4454?

非常感谢您提前帮助我。

修改:serialize()聊天

之后的一段代码
/* ===== 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 个答案:

答案 0 :(得分:1)

问题可能是,PHP尝试反序列化您的对象但无法找到类定义。

您可以执行以下两项操作之一:

在将对象放入会话之前手动

serialize(),并在加载类定义后对其进行unserialize()

或:使用autoloading