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


PHP/Smarty - Random Session data loss between 2 pages

我面临着PHP遇到的最奇怪的问题。我会尽量做到详尽无遗,因为每一个细节都可以算数。

我有3个PHP页面,它们的HTML是使用Smarty生成的。他们都把session_start()称为最高层。

  • 第一个页面可能加载很重,它显示了大量可点击的图片,这些图片是PHP复杂对象的预览
  • 如果选择了一张图片,它会指向具有特定URL的第二个页面。此页面将生成一个与URL信息相关的PHP对象(因此此页面不需要上一页的信息即可工作。如果您随时复制粘贴此URL,它就会工作)。此对象将使用唯一id存储到$_SESSION
  • 第三个页面作为img src包含在第二个页面的HTML代码中(使用Smarty生成)。这是一个PHP页面,在URL参数中有对象的会话id,并在$_session中读取对象的信息,创建它的图像预览并转换为带标题的图像("Content-type:image/jpeg")

综上所述:沉重的第一个页面=>第二个页面创建并存储一个PHP对象到$_SESSION=>第三个页面,包括在第二个网页的HTML代码中,搜索该对象并创建预览。

问题是,有时,第三个页面试图在$_SESSION中加载对象,但它不存在!

一些事实:

  • 当第二个页面作为具有自己URL的独立页面加载时,问题永远不会发生
  • 只有当沉重的第一页开始加载图像,我们疯狂地点击第一个出现的图像时,问题才会随机出现
  • 无论情况如何,如果我在第二页的最后转储$_SESSION变量,我总是可以在会话中看到生成的对象

因此,问题似乎位于第二页的末尾和第三页的开头之间,但所有这些都与第一页的活动有关!我所知道的是,它链接到页面之间的快速导航。

我几乎什么都试过了:

  • session_write_close()(在智能显示之前/之后的页面末尾,然后在session_start()之前的开头)
  • 在脚本末尾添加exit()
  • 即使是第三次会话开始时的sleep(1),以防会话关闭操作需要更多时间

什么都不管用。我没有更多的线索了。。。也许是Smarty?也许某个地方出现了一些名为bug#4454的奇怪PHP会话行为?

事先非常感谢你帮我做这件事。

编辑:serialize()聊天后的一段代码

/*=====Page2.php=====*//*正在创建对象$card并设置一些值*//*调用提供卡片预览的函数*/$assigns['front']=$card->getPreviewURL();/*其他东西。。。将$assigns分配给smarty。。。等等*//*=====卡对象类=====*/函数getPreviewURL(){$_SESSION['products'][$this->getObjectId()]=序列化($this);$url='/page3.php?s='$this->getObjectId();return$url;}/*=====Page2.html=====*/img src="{$front}"alt="toto"/*=====第3.php页=====*//*获取id值和读取会话*/if(!空($_GET['s'])){session_write_close();$session=新会话;if(!空($_SESSION['products'][$_GET['s']])){$product=取消序列化($_SESSION['products'][$_GET['s']]);}其他{日志('$_SESSION[products]['.$_GET['s'].']不存在');header("状态:404未找到");出口}}

当错误发生时,我得到:

page2.php调试日志:会话值:[o20aee110e0853e74da4d17c9b7ab3075]=>O:8:"明信片":19:{s:4:"tmpl";O:16:"明信片模板":20:{s:2:"id";s:3:"152";s:2:"or";i:0;s:3:"ord";s:2:"14";s:11:"description";s:0:"等
page3.php调试日志:$_SESSION[产品][o20aee110e0853e74da4d17c9b7ab3075]不存在

问题可能是,PHP试图取消对象的序列化,但找不到类定义。

你可以做以下两件事之一:

在将对象放入会话之前手动序列化(),在加载类定义之后取消序列化()。

或者:使用自动加载。