一.调试模式
define('APP_DEBUG', true);
调试模式的优势在于:
- 开启日志记录,任何错误信息和调试信息都会详细记录,便于调试;
- 关闭模板缓存,模板修改可以即时生效;
- 记录SQL日志,方便分析SQL;
- 关闭字段缓存,数据表字段修改不受缓存影响;
- 严格检查文件大小写(即使是Windows平台),帮助你提前发现Linux部署可能导致的隐患问题;
- 通过页面Trace功能更好的调试和发现错误;
-
'SHOW_ERROR_MSG' => true, // 显示错误信息
'SHOW_ERROR_MSG' => false,
'ERROR_MESSAGE' => '发生错误!'
'ERROR_PAGE' =>'/Public/error.html'
'LOG_RECORD' => true, // 开启日志记录
'LOG_LEVEL' =>'EMERG,ALERT,CRIT,ERR', // 只记录EMERG ALERT CRIT ERR 错误
// 显示页面Trace信息
'SHOW_PAGE_TRACE' =>true,断点调试,可用trace()方法
变量调试 dump()方法
性能调试 G()方法
错误调试 E()方法
模型调试 getLastSql()方法
getDbError()方法
二.数据缓存
缓存类型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache
S(array(
'type'=>'memcache',
'host'=>'192.168.1.10',
'port'=>'11211',
'prefix'=>'think',
'expire'=>60)
);
快速缓存Data数据,保存到指定的目录 F('data',$Data,TEMP_PATH);
查询缓存 $Model->cache('cache_name')->select();
$value = S('cache_name');
SQL解析缓存 'DB_SQL_BUILD_CACHE' => true,
静态缓存 'HTML_CACHE_ON' => true, // 开启静态缓存
'HTML_CACHE_TIME' => 60, // 全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX' => '.shtml', // 设置静态缓存文件后缀
'HTML_CACHE_RULES' => array( // 定义静态缓存规则
// 定义格式1 数组方式
'静态地址' => array('静态规则', '有效期', '附加规则'),
// 定义格式2 字符串方式
'静态地址' => '静态规则',
)
三.安全
输入过滤
使用系统内置的I函数
是避免输入数据出现安全隐患的重要手段,I函数默认的过滤方法是htmlspecialchars
I('get.title','','strip_tags'); // 用strip_tags过滤$_GET['title']
$this->data($data)->filter('strip_tags')->add();
表单合法性检测
namespace HomeModel;
class UserModel extends ThinkModel{
protected $insertFields = array('account','password','nickname','email');
protected $updateFields = array('nickname','email');
}
在使用的时候,我们调用create方法的时候,会根据提交类型自动识别insertFields和updateFields属性
M('User')->field('account,password,nickname,email')->create();
表单令牌
在应用或者模块的配置目录下面的行为定义文件tags.php中
return array(
// 添加下面一行定义即可
'view_filter' => array('BehaviorTokenBuild'),
// 如果是3.2.1版本 需要改成
// 'view_filter' => array('BehaviorTokenBuildBehavior'),
);
'TOKEN_ON' => true, // 是否开启令牌验证 默认关闭
'TOKEN_NAME' => '__hash__', // 令牌验证的表单隐藏字段名称,默认为__hash__
'TOKEN_TYPE' => 'md5', //令牌哈希验证规则 默认为MD5
'TOKEN_RESET' => true, //令牌验证出错后是否重置令牌 默认为true
模型类在创建数据对象的同时会自动进行表单令牌验证操作,如果你没有使用create方法创建数据对象的话,则需要手动调用模型的autoCheckToken
方法进行表单令牌验证。如果返回false,则表示表单令牌验证错误
防止SQL注入
系统会对数据进行强制的数据类型检测,并且对数据来源进行数据格式转换 escape_string
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
-
- 对所有公共的操作方法做必要的安全检查,防止用户通过URL直接调用;
- 不要缓存需要用户认证的页面;
- 对用户的上传文件,做必要的安全检查,例如上传路径和非法格式;
- 如非必要,不要开启服务器的目录浏览权限;
- 对于项目进行充分的测试,不要生成业务逻辑的安全隐患(这可能是最大的安全问题);
- 最后一点,做好服务器的安全防护;
四.类库扩展
公共类库 指ThinkPHP/Library
目录下面的类库
如果你的类库没有采用命名空间的话,需要使用import方法先加载类库文件,然后再进行实例化,例如:我们定义了一个Counter类(位于Com/Sina/Util/Counter.class.php):
应用类库 在应用或者模块目录下面的类库
驱动扩展 缓存驱动默认位于ThinkCacheDriver
命名空间下面
提供了包括APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache缓存方式的驱动扩展,缓存驱动必须继承ThinkCache类,并实现下面的驱动接口:
五.专题
session(array('name'=>'session_id','expire'=>3600));
session('name',null); // 删除name
session(null); // 清空当前的session
session('[pause]'); // 暂停session写入
session('[start]'); // 启动session
session('[destroy]'); // 销毁session
session('[regenerate]'); // 重新生成session id
$User = M('User'); // 实例化User对象
$count = $User->where('status=1')->count();// 查询满足要求的总记录数
$Page = new ThinkPage($count,25);// 实例化分页类 传入总记录数和每页显示的记录数(25)
$show = $Page->show();// 分页显示输出
// 进行分页数据查询 注意limit方法的参数要使用Page类的属性
$list = $User->where('status=1')->order('create_time')->limit($Page->firstRow.','.$Page->listRows)->select();
$this->assign('list',$list);// 赋值数据集
$this->assign('page',$show);// 赋值分页输出
$this->display(); // 输出模板
public function upload(){
$upload = new ThinkUpload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->savePath = './Public/Uploads/'; // 设置附件上传目录
// 上传文件
$info = $upload->upload();
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功
$this->success('上传成功!');
}
}
$Verify = new ThinkVerify();
$Verify->entry();
$image = new ThinkImage();
$image->open('./1.jpg');
$width = $image->width(); // 返回图片的宽度
$height = $image->height(); // 返回图片的高度
$image->crop(400, 400)->save('./crop.jpg');
$image->thumb(150, 150)->save('./thumb.jpg');
REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST提出了一些设计概念和准则:
1、网络上的所有事物都被抽象为资源(resource);
2、每个资源对应一个唯一的资源标识(resource identifier);
3、通过通用的连接器接口(generic connector interface)对资源进行操作;
4、对资源的各种操作不会改变资源标识;
5、所有的操作都是无状态的(stateless)。需要注意的是,REST是设计风格而不是标准。
RESTFul支持更为灵活,你不需要使用REST模式,只需要把控制器继承ThinkControllerRestController即可。继承RestController控制器后你的访问控制器就可以支持下面的一些功能:
- 支持资源类型自动检测;
- 支持请求类型自动检测;
- RESTFul方法支持;
- 可以设置允许的请求类型列表;
- 可以设置允许请求和输出的资源类型;
- 可以设置默认请求类型和默认资源类型;
namespace HomeController;
use ThinkControllerRpcController;
class ServerController extends RpcController{
protected $allowMethodList = array('test1','test2');
public function test1(){
return 'test1';
}
public function test2(){
return 'test2';
}
public function test3(){
return 'test3';
}
}