序列化类实例从会话中消失

时间:2014-06-05 12:01:41

标签: php session instance-variables

我已经制作了一个img编辑器,在99.9%的情况下工作正常。

然而,在那种罕见的0.1%奇怪的事情中,我的会话记得没有正确的值。

我在课程的页面中有这个:

$imgScreen = new img4crop();
// And here some settings like $imgScreen->setExtraJs($extraJs);

在这个类中,我有一个函数将$this数据保存到数组中:

private function save(){
    $_SESSION['cropper'][$this->uniqid] = serialize($this);
}

init-page.php中,我打开一个fancybox,将设置重新加载到课程中:

$info = unserialize($_SESSION['cropper'][$_GET['id']]);
// Should now be the same as $imgScreen

问题
有时$_SESSION['cropper'][$_GET['id']]设置为NULL。我不知道为什么。 这种情况很少发生。密钥已设置。 当我调试并将echo $_SESSION['cropper'][$this->uniqid];附加到save()函数时,它会为我提供我希望它拥有的值。

那么,我的会话值在哪里,只有那个罕见的事件?为什么它不在fancybox屏幕中?

第一条评论后:初始页面可以启动多个实例,它们各自在$_SESSION['cropper']中获得自己的值。在上面的情况中,它们都有效,只有一个不成功。在重新加载时,我开始新的实例并且完全相同的屏幕不起作用,即使我现在有一个新的,新的id

编辑:它变得更奇怪:如果图像具有与该类名称相同的文件的位置将使用,则没有问题。奇怪的部分:全班没有关于文件的代码,除了最后一步(屏幕有3个步骤),我使用ImageMagick。
重要的是要知道:当我安装发生这种情况的页面时,目标文件也不存在,开始为空。

2 个答案:

答案 0 :(得分:0)

在序列化对象时,必须确保在反序列化对象之前加载基类(原型)。对于PHP本机对象,您不必执行任何操作,它将加载基类。

你的变量$ this是一个类的实例。为了使$ this存在,基类需要存在。也许它大部分时间都在工作,因为自动加载器或您正在加载项目的特定顺序。

答案 1 :(得分:0)

事实证明,解决方案是一个与实际代码无关的奇怪的小东西:

在我的index.php中,我$_SESSION['cropper'] = array();重置数组,然后让显示编辑屏幕的功能为裁剪器设置新设置,这非常合适。

在那个html中,我有一个带有反缓存的图像:

echo '<img src="'.$image_url.'?'.time.'" />';

$image_url为空/未定义时出现问题,导致源代码如下:?1420793438。它以?开头,因此有效地调用index.php?1420793438

index.php开始时我们重置,结果是一个空数组。