【问题标题】:serialized class instance disappears from session序列化的类实例从会话中消失
【发布时间】:2014-07-26 10:01:13
【问题描述】:

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

但是,在那罕见的 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 屏幕中?

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

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

【问题讨论】:

  • 好吧,如果启动不同的会话,它会是 NULL,不是吗?
  • 没有 new 会话开始,只是继续。同一$_SESSION 数组中的所有其他值保持完全相同。仅此 1 个值。
  • 你试过转储整个会话吗?
  • 哈哈,当然,调试了一段时间了。
  • 您能否自己重现此问题,或者这些错误是您从访问者那里看到的?它可能只是一个尝试不同 id 的机器人,或者甚至是一个用户试图在会话之间错误地移动。

标签: php session instance-variables


【解决方案1】:

当您序列化对象时,您必须确保在反序列化对象之前加载基类(原型)。对于 PHP 原生对象,您无需执行任何操作,它会加载基类。

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

【讨论】:

  • 但是当我序列化() $this 时,将其保存到会话变量,然后回显会话变量,我得到了结果字符串。我可以理解这可能是错误的,但是某些东西怎么会有值,并且在下一个屏幕上为 null 呢?错误不是当我(取消)序列化/初始化时,整个会话值消失
  • 您正在尝试跨进程保存对象。反序列化时,需要与序列化时相同的基础设施到位,以使其正常工作。反序列化会起作用,对象不会。尝试 var_dump 看看它的真实性质。
  • 但它几乎每次都能正常工作......事情变得更奇怪了:页面上有一张图片。如果手动填充它,脚本可以工作,我删除图像,它不起作用..我完全删除了 imgtag,它又可以工作了......这只是一个普通的图像,没有什么奇怪的,不是带有 mime 的 php 或什么...
【解决方案2】:

正如所料,解决方案是一个与实际代码无关的古怪小东西:

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

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

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

$image_url 为空/未定义时出现问题,导致源类似于以下内容:?1420793438。它以? 开头,因此它实际上是在调用index.php?1420793438

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

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2011-05-16
    • 2014-03-16
    相关资源
    最近更新 更多