我的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文件,而不是我编写的代码。
任何指针如何开始调试都将受到高度赞赏!
答案 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] 状态:好的