3.2.2 - 致命 - 未处理
最近使用sae,在未开启memcache的时候页面显示空白实际内部发生了一连串的错误导致最后的致命错误
在 Think\Storage\Driver\Sae.class.php 文件内
$this->mc = @memcache_init();这一句执行sae的memcache初始化,未开启时导致了如下错误:1.thinkphp系统执行时优先初始化文件存储方式(Think\Think.class.php):
// 这里初始的是sae
define('STORAGE_TYPE', 'Sae');
// 初始化文件存储方式
Storage::connect(STORAGE_TYPE);2.在未开启memcache的时候,这一句返回Warning错误3.thinkphp的Think\Think::appError方法捕获了这一错误
4.当执行捕获后的处理时,执行了下面的代码,因为$errno=2
所有走了default分支
static public function appError($errno, $errstr, $errfile, $errline) {
switch ($errno) {
case E_ERROR:
case E_PARSE:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
ob_end_clean();
$errorStr = "$errstr ".$errfile." 第 $errline 行.";
if(C('LOG_RECORD')) Log::write("[$errno] ".$errorStr,Log::ERR);
self::halt($errorStr);
break;
default:
$errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行.";
self::trace($errorStr,'','NOTIC');
break;
}
}5.然后执行trace方法:static public function trace($value='[think]',$label='',$level='DEBUG',$record=false) {
static $_trace = array();
if('[think]' === $value){ // 获取trace信息
return $_trace;
}else{
$info = ($label?$label.':':'').print_r($value,true);
$level = strtoupper($level);
if((defined('IS_AJAX') && IS_AJAX) || !C('SHOW_PAGE_TRACE') || $record) {
Log::record($info,$level,$record);
}else{
if(!isset($_trace[$level]) || count($_trace[$level])>C('TRACE_MAX_RECORD')) {
$_trace[$level] = array();
}
$_trace[$level][] = $info;
}
}
}在执行trace方法时 因为调用了没有定义的C() 方法,所以发生了致命错误因为@memcache_init(); @符号的存在导致错误被屏蔽了。
当去掉@符号时,显示下面的错误
Fatal error: Call to undefined function Think\C() in ThinkPHP/Library/Think/Think.class.php on line 334
Fatal error: Call to undefined function Think\C() in ThinkPHP/Library/Think/Think.class.php on line 313
该bug 可能是因为考虑runtime文件的加载时造成的,在加载Storage时,并未加载系统函数库
官方可以考虑优先加载系统函数库,以上为个人愚见,还望官方及早修复此问题
