【问题标题】:How can I keep Zend Framework from wiping out an existing Session?如何防止 Zend Framework 清除现有的 Session?
【发布时间】:2011-03-23 20:34:26
【问题描述】:

我接到了一项不好玩的任务,即尝试将 Zend 框架实例与古老的遗留代码结合起来,而不需要对遗留代码进行大量修改。其中一部分是一个多页表单,它接收大量数据,对其进行验证、处理,然后通过电子邮件将其发送给网站所有者。我的工作是将这些数据输入 ZF,然后我可以将其自动处理到数据库中。我不能使用 POST。我宁愿避免使用自动提交表单,因为我认为我不应该使用 Javascript。 Get 会非常笨拙。

我希望使用 Session 将数据从现有的表单处理器中取出并输入 ZF。数据已经在表单处理器的 Session 中。起初,我认为重定向到我的 ZF 实例(存在于主网站的子目录中)很简单。它是同一个域,应该是同一个会话,对吧?

嗯,ZF 处理其会话的方式导致旧的会话数据被完全彻底清除。它刚刚消失了。

那么 ZF 是否以清除现有会话的方式处理其 Session 或者这是侥幸?如果这不是侥幸,我该如何绕过它?如果是,可能是什么原因造成的/我该如何解决?

编辑

我将 Zend_Session_SaveHandler_DbTable 用于数据库支持的会话。这是在application.ini 中初始化的。下面是初始化代码:

resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "Sessions"
resources.session.saveHandler.options.primary = "sessionID"
resources.session.saveHandler.options.modifiedColumn = "lastModifiedTime"
resources.session.saveHandler.options.dataColumn = "data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"

我在使用会话时尝试调用session_start(),但这会产生错误。可能是因为保存处理程序代码已经初始化了会话,或者稍后才这样做。如果我尝试直接访问 $_SESSION 变量,我可能会出现错误,表明我试图访问未设置的变量。如果我先创建一个Zend_Session_Namespace,然后尝试访问$_SESSION,我将面临一个空会话。

【问题讨论】:

  • 不一定是同一个会话号。这取决于您如何使用 Zend_Session。你在使用命名空间(Zend_Session_Namespace)吗?自定义或自动生成的 ID?看看一些代码会有所帮助。
  • 如果可以检查,数据是仅在 ZF 应用程序中不可见,还是从两者中都删除了?
  • @netcoder 已编辑以根据要求添加更多信息。
  • @Phil 数据仅对采埃孚不可见。如果我回到原来的页面,数据就在那里。
  • @Daniel:你试过这个吗? new Zend_Session_Namespace(session_name()); 默认情况下,ZF 将使用 Default 会话名称,而 PHP 使用 PHPSESSID

标签: php zend-framework session


【解决方案1】:

因为您已将 ZF 设置为将会话保存到数据库而不是文件系统,所以让不使用相同 ZF 引导代码的脚本尝试调用会话将会失败。 (即便如此,他们也可能使用两个完全不同的会话 cookie 名称......)

因为您暗示 ZF 位是,所以解决方案很简单:暂时停止使用 ZF 的会话位。这意味着没有数据库表保存,没有命名空间处理程序,什么都没有。使用原始的$_SESSION 超全局,并使用与旧代码相同的会话设置。这是确保两个应用程序在修改旧代码的情况下访问相同会话数据的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2010-10-28
    • 2015-10-26
    • 2023-03-25
    • 2018-07-27
    相关资源
    最近更新 更多