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



我制作了一个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

问题
有时CCD_ 3被设置为CCD_。我不知道为什么<这种情况很少发生>密钥已设置。当我调试并将echo $_SESSION['cropper'][$this->uniqid];附加到save()函数时,它会给我想要的值。

那么,只有在这种罕见的情况下,我的会话价值会去哪里呢?为什么它不在fancybox屏幕上?

在第一条注释之后:初始化页面可以启动多个实例,每个实例在$_SESSION['cropper']中都有自己的值。在上述情况下,它们都起作用,只是其中一个不起作用。在重新加载时,我启动了新的实例,但完全相同的屏幕不起作用,尽管我现在有了一个新的、新的id

编辑:更奇怪的是:如果图像所在的位置有一个与类同名的文件,那么就没有问题。奇怪的部分:除了最后一步(屏幕有3个步骤(,我使用ImageMagick之外,整个类没有关于文件的代码
需要注意的是:当我安装发生这种情况的页面时,目标文件也不存在,开始为空。

序列化对象时,必须确保在取消序列化对象之前加载基类(原型(。对于PHP本机对象,您不必做任何事情,它将加载基类。

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

正如预期的那样,这个解决方案是一个与实际代码无关的古怪的小东西:

在我的index.php中,我执行$_SESSION['cropper'] = array();来重置数组,然后让显示编辑器屏幕的函数为cropper设置新的设置,这非常好。

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

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

$image_url为空/未定义时出现问题,导致类似以下的源:?1420793438。它从一个?开始,所以它实际上是在调用index.php?1420793438

index.php开始时,我们重置,导致一个空数组。

最新更新