一、入口文件关闭调试,配置文件配置异常页面
在生产环境中系统的错误信息不能暴露给用户,入口文件的 APP_DEBUG 默认为开启状态
代码语言:javascript复制define('APP_DEBUG',true);
此时如果用户访问到不存在的模块、控制器或者方法会出现:
在生产环境中需要把 APP_DEBUG 设置为 FALSE 或者将该定义屏蔽:
代码语言:javascript复制define('APP_DEBUG',false);
此时如果用户访问到不存在的模块、控制器或者方法会出现:
这个错误的默认模板页在 ./ThinkPHP/Tpl/think_exception.tpl,可以设置自定义的异常页面来代替 ThinkPHP 默认的错误页面,在配置文件 config.php 中配置:
代码语言:javascript复制 //异常页面
'TMPL_EXCEPTION_FILE' => './Public/Admin/error.html',
在访问不存在的模块、控制器或方法时,会加载默认的或者自定义的异常页面模板。
二、定义 EmptyController 类
例如在 Admin 模块下创建一个 EmptyController.class.php,里面的 index 方法定义当用户访问一个不存在的控制器时系统该如何处理:
<?php namespace AdminController; use ThinkController; class EmptyController extends Controller{ public function index(){ //跳转或加载404页 } }
三、定义空操作 _empty()
例如在 Admin 模块的 Common 控制器中定义一个 _empty() 方法,当用户访问一个不存在的方法时,就会按照空方法中的设置进行处理:
代码语言:javascript复制 //空方法
function _empty() {
//跳转或加载404页
}
注:如果同时请求一个不存在的控制器和一个不存在的方法,或者请求一个不存在的模块时,会加载默认或者自定义的异常页面,而不会执行 EmptyController::index 或 _empty()。
四、数据库错误
在默认情况下,如果程序中的 SQL 语句出现了语法错误,很可能会把数据库信息暴露给用户:
注:在 APP_DEBUG 为 TRUE 且没有自定义异常页面时发生数据库错误会输出以上信息。
在关闭 APP_DEBUG 后,遇到数据库错误时,会加载默认的或者自定义的异常页面。如果希望在发生数据库错误时进行自定的处理时,可以在配置文件中设置数据库调试模式为 FALSE(该配置默认值是 TRUE):
代码语言:javascript复制'DB_DEBUG' => FALSE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增
当该选项开启时,会记录 SQL 日志,路径是 ./Application/Runtime/Logs/YourModule/
但是当该选项开启时,无法自定义处理异常,只能加载系统默认或者自定义的一场模板。如果关闭该选项,同时在开发时与数据库相关的操作都必须捕获异常,例如:
代码语言:javascript复制 $result = M('session')->field('a')->select();
if($result === false) {
//处理
}
或者
代码语言:javascript复制try {
$result= M("session")->field('a')->select();
} catch (Exception $e) {
//处理
}
注:捕获异常可以参见 ./ThinkPHP/Library/Think/Db/Driver.class.php Line:169
代码语言:javascript复制 try{
$result = $this->PDOStatement->execute();
// 调试结束
$this->debug(false);
if ( false === $result ) {
$this->error();
return false;
} else {
return $this->getResult();
}
}catch (PDOException $e) {
$this->error();
return false;
}