我正面临着我见过的最奇怪的PHP问题。我会尽量详尽无遗,因为每个细节都可以计算。
我有3个PHP页面,他们的HTML是使用Smarty生成的。他们都在session_start()
顶部打电话。
$_SESSION
中,并带有唯一ID。总结:
沉重的第一页=>第二页创建并将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
答案 0 :(得分:1)
问题可能是,PHP尝试反序列化您的对象但无法找到类定义。
您可以执行以下两项操作之一:
在将对象放入会话之前手动serialize(),并在加载类定义后对其进行unserialize()。
或:使用autoloading。