|
本帖最后由 fltn03 于 2012-8-25 16:23 编辑
前不久对CI的Log类进行了扩展,增加了一种日志类别——RECOR(即record),其级别介于Error与Debug之间。本以为没有问题,但今天在使用的时候发现了一个问题,如题所述:Log类中无法使用&get_instance()函数。
贴上我以前的代码:
1、config.php中信息:
PHP复制代码
/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
| 0 = Disables logging, Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Record Message
| 3 = Debug Messages
| 4 = Informational Messages
| 5 = All Messages
|
*/
$config['log_threshold'] = 3;
/*
|--------------------------------------------------------------------------
| 是否开启锁文件机制
|--------------------------------------------------------------------------
|
| 在进行文件的读写操作时需要用到文件的锁机制,但是在一些系统中使用锁机制会影响到
| 网站的整体性能,所以特地增加了是否需要开启锁机制的功能。
| FALSE:不开启;TRUE:开启
|
*/
$config['flock_enable'] = FALSE;
复制代码
2、MY_Log.php文件:
PHP复制代码
class MY_Log extends CI_log {
/**
* 日志级别
*/
protected $_levels = array( 'ERROR' => '1',
'RECOR' => '2',
'DEBUG' => '3',
'INFRO' => '4',
'ALL' => '5');
/**
* Write Log File
* 扩展原生方法
* 去掉了写文件时的锁文件机制,因为锁机制会影响到系统的整体性能。
*
* Generally this function will be called using the global log_message() function
*
* @param string the error level
* @param string the error message
* @param bool whether the error is a native PHP error
* @return bool
*/
public function write_log ($level = 'error', $msg, $php_error = FALSE)
{
if ($this->_enabled === FALSE)
{
return FALSE;
}
$level = strtoupper($level);
if ( ! isset($this->_levels [$level]) OR ($this->_levels [$level] > $this->_threshold ))
{
return FALSE;
}
$filepath = $this->_log_path .'log-'.date('Y-m-d').'.php';
$message = '';
if ( ! file_exists($filepath))
{
$message .= "<"."?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?".">\n\n";
}
if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE ))
{
return FALSE;
}
$CI = & get_instance ();//该处代码当$config['log_threshold']>2时就报错
//获取客户端IP地址
$ip = $CI->input->ip_address();
$ip_string = $ip . str_repeat('-',(15 - strlen($ip)) );
unset($CI);
$message .= $level . ' ' . (($level == 'INFO') ? ' -' : '-') . ' ' . date($this->_date_fmt )
. '---' . $ip_string . ' --> ' . $msg . "\n";
//判断是否需要开启文件锁机制
$config = & get_config ();
//判断config.php配置文件中是否有该配置
if(! isset($config['flock_enable']))
{
$config['flock_enable'] = TRUE;
}
if($config['flock_enable'] === FALSE)
{
fwrite($fp, $message);
}
else
{
flock($fp, LOCK_EX );
fwrite($fp, $message);
flock($fp, LOCK_UN );
fclose($fp);
}
@chmod($filepath, FILE_WRITE_MODE );
return TRUE;
}
// --------------------------------------------------------------------
}
/* End of file MY_Log.php */
/* Location: ./application/libraries/MY_Log.php */
复制代码
说明:为了在日志中记录下客户端的IP地址,所有使用了input类中的ip_adress()方法获取;便使用了
但现在问题出现了:
当$config['log_threshold']<=2时,log_message()函数能正常运行;
但是当$config['log_threshold']>2时,log_message()函数就报错:
Fatal error: Class 'CI_Controller' not found in D:\xampp\htdocs\CI\system\core\CodeIgniter.php on line 233
经过查找原因后发现:
在Log类中添加”$CI = & get_instance();“一行代码就会报错。
按照CI2.1手册的介绍,如果在library类中使用CodeIgniter对象,只需要“$CI =& get_instance();”即可。
的确,在其他的library中操作是没有任何问题,但是在log类中却存在问题!
如果以上分析有问题,欢迎指正!
|
|