学习笔记(三)

一.调试模式

    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 Home\Model;

      class UserModel extends \Think\Model{

          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('Behavior\TokenBuild'),

        // 如果是3.2.1版本 需要改成

        // 'view_filter' => array('Behavior\TokenBuildBehavior'),

      );

      '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):

    应用类库  在应用或者模块目录下面的类库

    

    驱动扩展  缓存驱动默认位于Think\Cache\Driver命名空间下面 

          提供了包括APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache缓存方式的驱动扩展,缓存驱动必须继承Think\Cache类,并实现下面的驱动接口:

五.专题

    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 \Think\Page($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 \Think\Upload();// 实例化上传类

      $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 \Think\Verify();

    $Verify->entry();

 

    $image = new \Think\Image();

    $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模式,只需要把控制器继承Think\Controller\RestController即可。继承RestController控制器后你的访问控制器就可以支持下面的一些功能:

    •   支持资源类型自动检测;
    •   支持请求类型自动检测;
    •   RESTFul方法支持;
    •   可以设置允许的请求类型列表;
    •       可以设置允许请求和输出的资源类型;
    •       可以设置默认请求类型和默认资源类型; 

    namespace Home\Controller;

    use Think\Controller\RpcController;

    class ServerController extends RpcController{

    protected $allowMethodList = array('test1','test2');

      public function test1(){

          return 'test1';

        }

      public function test2(){

          return 'test2';

        }

      public function test3(){

          return 'test3';

        }

    }

 

posted @ 2016-01-08 14:08  netRuby  阅读(268)  评论(0编辑  收藏  举报