如何调试Codeigniter致命错误

时间:2015-10-13 10:11:18

标签: codeigniter debugging

我的Codeigniter 3.0网站,一直运行到今天早上,一直停止工作,在所有页面上显示以下错误消息:

  

致命错误:调用非对象中的成员函数row()   /home/[mysite]/public_html/system/libraries/Session/drivers/Session_database_driver.php   在第160行

     

遇到PHP错误

     

严重性:警告

     

消息:无法修改标头信息 - 已发送的标头   (输出始于   /home/[mysite]/public_html/system/libraries/Session/drivers/Session_database_driver.php:160)

     

文件名:core / Common.php

     

行号:569
  遇到PHP错误

     

严重性:错误

     

消息:调用非对象

上的成员函数row()      

文件名:drivers / Session_database_driver.php

     

行号:160

此外,error_log中显示以下错误消息:两个内存耗尽的消息,两个&三天前(不知道它们是否相关,因为网站运行良好之后,它们只出现了两次),然后出现了很多相同的PHP致命错误(我只复制了三次,但有很多和很多相同的错误):

  

[10-Oct-2015 06:04:04 UTC] PHP致命错误:允许的内存大小   33554432字节耗尽(试图分配12个字节)   第919行/home/[mysite]/public_html/system/database/DB_driver.php

     

[2015年10月11日02:52:43 UTC] PHP致命错误:允许的内存大小   33554432字节耗尽(试图分配32个字节)in   /home/[mysite]/public_html/system/database/drivers/mysqli/mysqli_result.php   在第168行

     

[13-Oct-2015 08:25:51 UTC] PHP致命错误:致电a   成员函数row()在非对象中   /home/[mysite]/public_html/system/libraries/Session/drivers/Session_database_driver.php   在第160行

     

[13-Oct-2015 08:26:08 UTC] PHP致命错误:致电a   成员函数row()在非对象中   /home/[mysite]/public_html/system/libraries/Session/drivers/Session_database_driver.php   在第160行

     

[2015年10月13日08:26:17 UTC] PHP致命错误:致电a   成员函数row()在非对象中   /home/[mysite]/public_html/system/libraries/Session/drivers/Session_database_driver.php   在第160行

Session_database_driver.php中的第160行是:

        if (($result = $this->_db->get()->row()) === NULL)

core/Common.php中的第569行是:

        header($server_protocol.' '.$code.' '.$text, TRUE, $code);

这是包含臭名昭着的第160行的函数:

public function read($session_id)
    {
        if ($this->_get_lock($session_id) !== FALSE)
        {
            // Needed by write() to detect session_regenerate_id() calls
            $this->_session_id = $session_id;

            $this->_db
                ->select('data')
                ->from($this->_config['save_path'])
                ->where('id', $session_id);

            if ($this->_config['match_ip'])
            {
                $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);
            }

            if (($result = $this->_db->get()->row()) === NULL)
            {
                $this->_fingerprint = md5('');
                return '';
            }

            // PostgreSQL's variant of a BLOB datatype is Bytea, which is a PITA to work with, so we use base64-encoded data in a TEXT field instead.
            $result = ($this->_platform === 'postgre')
                ? base64_decode(rtrim($result->data))
                : $result->data;

            $this->_fingerprint = md5($result);
            $this->_row_exists = TRUE;
            return $result;
        }

        $this->_fingerprint = md5('');

        return '';
    }

但它们都是原始的CI文件。我没有改变任何东西。

我不知道出了什么问题以及导致这种情况的原因,我不知道如何开始调试它,因为错误消息都指向CI文件,而不是我编写的代码。

任何指针如何开始调试都将受到高度赞赏!

1 个答案:

答案 0 :(得分:0)

行。弄清楚了!发布解决方案以防其他人遇到同样的问题。

This question让我检查了我的ci_session表,当我试图在phpMyAdmin上访问该表时,弹出一个错误窗口,说该表被标记为已压碎并且应该被修复。

在cPanel上,我进入了数据库> MySQL数据库,然后点击"修复数据库"。它很快就完成了维修,瞧!我的网站恢复了生机。

修复动作结束时出现以下几行,所以确实有些错误。什么和为什么 - 我还是不知道。如果有人知道什么可能导致会话表损坏,我很高兴听到。

  

[mydb.ci_sessions3] info:错误的bytesec:49-52-52 at 797796;跳过

     

[mydb.ci_sessions3] info:错误的bytesec:49-52-52 at   797796;跳过

     

[mydb.ci_sessions3] info:错误的bytesec:   49-52-52 at 797796;跳过

     

[mydb.ci_sessions3]警告:   行数从868更改为864

     

[mydb.ci_sessions3]   状态:好的