【问题标题】:Cannot regenerate session id zend framework 2?无法重新生成会话 id zend 框架 2?
【发布时间】:2014-02-01 10:37:03
【问题描述】:

我在管理面板中使用了 ZFcuser 模块。当我登录到管理面板时,它会返回如下错误:

警告:session_regenerate_id():无法重新生成会话 ID - 标头已在 /home/public_html/dev/vendor/zendframework/zendframework/library/Zend/Session/SessionManager.php 第 260 行发送

这在我的本地 Windows 系统中运行良好,但在我的 linux 托管服务器中运行时返回此类警告。

需要帮助来解决这个问题。提前致谢。

【问题讨论】:

  • 确保在您的托管服务器上的 php.ini 中启用了输出缓冲
  • 我最好的客人是你的文件的开头有一些东西,windows(或者很可能是你的windows中的php)正在忽略它,但linux(php)认为它是输出,禁用 ZFuser 模块并尝试手动使用会话,看看它有效吗?
  • 检查文件的编码。它们都是没有 BOM 的 UTF-8 吗?
  • 您可以通过在 SessionManager::regenerateId() 中抛出异常来尝试在会话重新生成之前跟踪发送标头的文件。等待您可以分析堆栈跟踪并检查类以获取可能的输出
  • @Shahrokhian,它们是不同的问题。如果您使用 php,您就会明白使用 ZF2 的会话存在一些纯 php 会话不会发生的问题。

标签: php session zend-framework2 zfcuser


【解决方案1】:

您可以使用 ZF2 SessionManager 重新生成会话 ID:

$manager = new Zend\Session\SessionManager;
$manager->regenerateId();

但是,您的错误可能不是由此功能引起的,而是由于其他原因。会话管理(session_start() 或重新生成会话 id)只有在您没有使用 echo 或在那段代码之前使用类似的东西时才有可能:

例如,这将失败:

<?php
echo 'Hello';
session_start();

另一方面,这将起作用:

<?php
session_start();
echo 'Hello';

您必须非常小心地打开和关闭 php 标签。如果您的类中有任何关闭 php 标记,请将其删除。如果在此之后有空行,则将其解释为响应中返回的文本,这会导致会话出现问题。这也会失败:

<?php
// Do some work
?>
<!-- blank line -->
<?php
session_start();
?>

所以:检查您的所有代码是否有 echoprint 等等。此外,检查源代码中的任何关闭 php 标记。如果以上所有内容对您没有帮助,请在您重新生成会话 ID 的位置发布代码,这可能会提供更多见解。

【讨论】:

  • 嗨 Jurian 感谢您的回复,但我使用了 zfcuser 模块,它的第三方模块在 zf2 中提供。所以我认为在 session_start() 或 php end close 错误之前没有 echo 或 print 可用。可能还有其他问题吗?
  • @Chirag 我猜您不仅将 ZfcUser 用作模块。如果您关闭 ALL 其他模块(包括应用程序)会怎样?如果这不能解决问题,那么您的 index.php 文件是什么样的?另外,你有安装需要的php版本吗?
【解决方案2】:

当您将某些字符转储到 PHP 标准输出时,通常会出现此错误。这会导致将 HTTP 标头发送到 Web 浏览器,因此您无法再添加会话标头。

要解决此问题,请确保在开始会话之前不要echoprintf 任何字符。还要确保您的 PHP 类文件没有关闭 ?&gt; 标记。如果您的 PHP 类文件中 ?&gt; 标记后有一些字符,这些字符将被转储到标准输出,从而中断您的会话。

【讨论】:

    【解决方案3】:

    请检查以下

    protected function _initSession() {
        $config = array(
            'name'  => 'session',
            'primary'  => 'id',
            'modifiedColumn' => 'modified',
            'dataColumn' => 'data',
            'lifetimeColumn' => 'lifetime',
            'lifetime' => 60*60*24*30,
        );
    
        Zend_Session::setSaveHandler(new F_Session_SaveHandler_DbTable($config));        
    }
    

    【讨论】:

    • 你指的是ZF1。问题是关于 ZF2 和 ZF2 模块 (ZfcUser)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2015-04-03
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多