在 Kohana 登录时出现错误消息

3

我是一名使用 Kohana 3 的 IT 技术人员,遇到了一个用户登录问题。

我使用以下代码进行登录:

$success = Auth::instance()->login($_POST['login_user'], $_POST['login_password'], $remember);

我收到了以下错误信息:

Session_Exception [ 1 ]: Error reading session data. ~ SYSPATH/classes/kohana/session.php [ 326 ]

我已经创建了sessions表格,使用以下SQL代码:

CREATE TABLE `sessions` (
  `session_id` varchar(24) NOT NULL,
  `last_active` int(10) unsigned DEFAULT NULL,
  `contents` text,
  PRIMARY KEY (`session_id`),
  KEY `sessions_fk1` (`last_active`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

还有config文件夹中的session.php:

<?php defined('SYSPATH') or die('No direct script access.');

return array(
    'database' => array(
        /**
         * Database settings for session storage.
         *
         * string   group  configuation group name
         * string   table  session table name
         * integer  gc     number of requests before gc is invoked
         * columns  array  custom column names
         */
        'group'   => 'default',
        'table'   => 'sessions',
        'gc'      => 500,
        'columns' => array(
            /**
             * session_id:  session identifier
             * last_active: timestamp of the last activity
             * contents:    serialized session data
             */
            'session_id'  => 'session_id',
            'last_active' => 'last_active',
            'contents'    => 'contents'
        ),
    ),
);

?>

这里可能存在什么问题?
谢谢!
6个回答

4
我不知道这是否有帮助,但我遇到过类似的问题。
问题的原因是使用一个库(Facebook SDK),它自己初始化了会话,并且使用 $_SESSION 变量处理会话。我注意到有两个 Cookie - session(Kohanas 会话 ID)和 PHPSESSID,这可能是问题的原因。
我修改了库,使其不会自动启动会话,问题得以解决。
所以,您应该检查是否在其他地方启动了会话。

0

我在切换到在线服务器时遇到了一些问题(不止一次 :(,因此最好提供一些清晰的指导)。

建议


§) 如果您正在使用数据库会话适配器:

Session::$default = 'database';   

i. - 检查您的数据库凭据是否正确。
ii. - 检查分配给sessions数据的表的类型和大小是否正确。


§) 如果您正在使用 加密 保护您的会话数据(config/session.phpconfig/.../session.php):

return array(
  'cookie' => array(
    // ...
    'encrypted' => TRUE,
    // ...
    ),
  'database' => array(
    // ...
    'encrypted' => TRUE,
    // ...
    ),
  );

请检查您是否已安装mcrypt

$ php -m|grep mcrypt
mcrypt // installed

ii- 检查您是否使用了相同的key来加密数据(config/encrypt.phpconfig/.../encrypt.php):

return array(
    'default' => array(
        'key'    => 'yabadabadoo!',
        'cipher' => MCRYPT_RIJNDAEL_128,
        'mode'   => MCRYPT_MODE_NOFB,
    ),

解决方法

§) 如果可能的话,请删除所有会话数据,然后重试。

i) 对于本地适配器:删除位于...的所有(或仅与您的应用程序相对应的)会话文件

在默认位置存储Web服务器的会话数据。存储位置由php.ini中的session.save_path定义或由ini_set定义。

ii) 对于cookie适配器:在受影响的浏览器中手动删除会话cookie,或以编程方式删除(如果有多个用户受到影响):(PHP)如何正确销毁会话cookie?

iii) 对于数据库适配器:TRUNCATE TABLE sessions(删除会话表的所有记录)


0

对我来说,解决方案是设置php.ini

session.auto_start = 0

当然,在完成设置后需要重启您的Web服务器


0

不确定您是否解决了这个问题。但我遇到了同样的问题,与我的php配置有关。我正在使用NGNIX和php-fpm。默认情况下,我的会话文件尝试保存到不存在的目录中。因此,我将session.save_path更改为有效路径,问题得到了解决。


0
Session_Exception [ 1 ]: 读取会话数据时出错。 ~ SYSPATH/classes/kohana/session.php [ 326 ]
这取决于您正在运行的版本,但是当在read中反序列化会话数据时抛出异常会导致此问题。您可以在此处查看有关此错误的bug报告:Session read errors not properly ignored。解决方案是升级到最新版本(如果您尚未升级)。
您需要查看会话数据的其他内容。您必须查看为什么您的数据已损坏并且无法正确读取。这可能是由__sleep中的代码生成的错误。

实际上我正在使用最新版本,即3.2版。那么,这是__sleep方法的一个bug吗? - Felipe Peña
也许吧。我会向Kohana提交一个错误报告,看看开发人员会说什么。 - The Pixel Developer

0
一种解决方法是在创建Facebook SDK实例之前实例化一个会话实例。例如:
$this->_session = Session::instance('native');
$this->_facebook = new Facebook(array(
    'appId'  => 'app_id',
    'secret' => 'app_secret',
));

如果您查看Facebook类构造函数内的代码,您会发现它检查是否已启动会话:

public function __construct($config) {
    if (!session_id()) {
      session_start();
    }
    parent::__construct($config);
    if (!empty($config['sharedSession'])) {
      $this->initSharedSession();
    }
  }

如果你先创建了会话,它就会跳过那一段代码块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接