ThinkPHPV5.0.3 – 6

1-5写了框架的基本实现方法,对一个小中型的app接口的实现是没有问题,最后总结一下这个框架的一些扩展的东西,而且对自己写接口的一些理解。

1,首先研究了一下公共函数,也就是整个项目大部分地方都能用到的函数,所以就用公共函数,方便调用。

在application下边的common.php下边定义自己的函数,例如在common.php里边写了日志的函数和格式化当前时间的方法,方便调用:

define ("DATE_IP","时间-ip");
define ("API_NAME","接口名称");
define ("PARAMS","接口参数");
define ("API_ERROR","请求错误信息");
define ("REQUEST_METHOD","请求方式");
 
use think\request;
 
// 应用公共文件
 
function LogByApi()
{
    //Log::write('测试日志信息,这是警告级别,并且实时写入',DATE_IP);
    //Log::write('测试日志信息,这是警告级别,并且实时写入',API_NAME);
    //Log::write('测试日志信息,这是警告级别,并且实时写入',PARAMS);
    \think\Log::info([DATE_IP => "192.168.102.4",API_NAME => "用户登录接口测试"]);
    echo 'this is Log';
}
 
function DateByFormatWithString($formatString)
{
    return date($formatString,time());
}

这是扩展方法,可以在任何地方不用引用而去调用。

2,扩展类,在extend文件夹中创建不同的类,命名空间之后,就可以初始化类的方法和属性,然后全局进行调用。

3,日志的使用:

首先日志在每一次运行app和调用到不同url的时候,都会自动写入一次日志,日志的记录可以看见当前用户请求了多少次URL,以及各种请求参数,错误等都写在日志文件里边,方便后期错误的排查等。

日志的配置在config.php里边,至此ThinkPHPV5.0.3教程结束,感谢ThinkPHP。

PS:用户手册

    'log'                    => [
        // 日志记录方式,内置 file socket 支持扩展
        'type'  => 'File',
        // 日志保存目录
        'path'  => LOG_PATH,
        // 日志记录级别
        'level' => [],
    ],

type是写入日志的驱动文件,也就是File文件,路径在thinkphp/library/think/log/driver/File.php中。

如果要停止日志的写入,那么:

'log'   => [
    // 可以临时关闭日志写入
    'type'  => 'test',//type改为test,也就是走test文件
],

path为当前日志保存的路径,默认为LOG_PATH->app/runtime/log下边。

level为日志的级别,这个级别也可以说是分类,自己也可以设置自定义的,级别分别有:ThinkPHP对系统的日志按照级别来分类,并且这个日志级别完全可以自己定义,系统内部使用的级别包括:log 常规日志,用于记录日志error 错误,一般会导致程序的终止notice 警告,程序可以运行但是还不够完美的错误info 信息,程序输出信息debug 调试,用于调试信息sql SQL语句,用于SQL记录,只在数据库的调试模式开启时有效这是全局设置,如果要在控制器或者别的地方设置 ,则:

在使用日志记录之前,首先需要初始化日志类,指定当前使用的日志记录方式。
 
Log::init([
    'type'  =>  'File',
    'path'  =>  APP_PATH.'logs/'
]);

日志的清空:Log::clear();

日志授权,也就是该记录日志的条件:

5.0的日志功能支持写入授权,我们可以设置某个请求的日志授权Key,然后设置允许授权写入的配置Key,
实现个别用户日志记录的功能,从而提高高负载下面的日志记录性能。
首先需要在应用配置文件或者应用公共文件中添加当前访问的授权Key定义,例如:
// 设置IP为授权Key
Log::key(Request::instance()->ip());
然后在日志配置参数中增加allow_key参数,如下:
'log'   =>  [
    // 日志类型为File
    'type'      =>  'File',
    // 授权只有202.12.36.89 才能记录日志
    'allow_key' =>  ['202.12.36.89'],
]
5.0的日志功能支持写入授权,我们可以设置某个请求的日志授权Key,然后设置允许授权写入的配置Key,
实现个别用户日志记录的功能,从而提高高负载下面的日志记录性能。
首先需要在应用配置文件或者应用公共文件中添加当前访问的授权Key定义,例如:
// 设置IP为授权Key
Log::key(Request::instance()->ip());
然后在日志配置参数中增加allow_key参数,如下:
'log'   =>  [
    // 日志类型为File
    'type'      =>  'File',
    // 授权只有202.12.36.89 才能记录日志
    'allow_key' =>  ['202.12.36.89'],
]

日志是基于use think\Log;引用这个类之后,可以调用其中的方法:

方法	描述
Log::record()	记录日志信息到内存
Log::save()	把保存在内存中的日志信息(用指定的记录方式)写入
Log::write()	实时写入一条日志信息
//
Log::error();
//Log::write('测试日志信息,这是警告级别,并且实时写入',DATE_IP);
//Log::write('测试日志信息,这是警告级别,并且实时写入',API_NAME);
//Log::write('测试日志信息,这是警告级别,并且实时写入',PARAMS);
\think\Log::info([DATE_IP => "192.168.102.4",API_NAME => "用户登录接口测试"]);

可以直接引用完之后用类Log调用,也可以不引用,直接\think\Log去调用静态方法。

一个完整的日志格式:

---------------------------------------------------------------
[ 2016-12-10T12:30:42+08:00 ] ::1 ::1 GET /app/public/admin/index/getAll
[ log ] localhost/app/public/admin/index/getAll [运行时间:0.012196s][吞吐率:82.00req/s] [内存消耗:498.72kb] [文件加载:44]
[ info ] [ LANG ] /Applications/XAMPP/xamppfiles/htdocs/app/thinkphp/lang/zh-cn.php
[ info ] [ ROUTE ] array (
  'type' => 'module',
  'module' => 
  array (
    0 => 'admin',
    1 => 'index',
    2 => 'getAll',
  ),
)
[ info ] [ HEADER ] array (
  'host' => 'localhost',
  'user-agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:41.0) Gecko/20100101 Firefox/41.0',
  'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'accept-language' => 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
  'accept-encoding' => 'gzip, deflate',
  'cookie' => '_ga=; DoNotShowFTU=true; lastMangerHost=http%3A//localhost%3A8087',
  'connection' => 'keep-alive',
  'cache-control' => 'max-age=0',
)
[ info ] [ PARAM ] array (
)
[ info ] [ RUN ] app\admin\controller\Index->getAll[ /Applications/XAMPP/xamppfiles/htdocs/app/application/admin/controller/Index.php ]
[ info ] array (
  '时间-ip' => '192.168.102.4',
  '接口名称' => '用户登录接口测试',
)
[ info ] [ DB ] INIT mysql
[ info ] [ LOG ] INIT File
[ log ] error
[ sql ] [ DB ] CONNECT:[ UseTime:0.001605s ] mysql:dbname=db_wegoto;host=127.0.0.1;charset=utf8
[ sql ] [ SQL ] SHOW COLUMNS FROM `we_ad` [ RunTime:0.003666s ]
[ sql ] [ SQL ] SELECT * FROM `we_ad` [ RunTime:0.000637s ]
 
---------------------------------------------------------------

对API自己的一些想法,写api就不用在当前模块创建视图,也就是view,api只要输出数据就行,要么是xml,要么就是json。

1,所以对于app可以自己新建一个模块,api模块,里边有controller,有model,但是没有view,model主要保存当前数据表的数据和处理查询当前数据表的操作,控制器主要处理一些数据上的逻辑问题,然后返回给客户端。

一个应用可以创建一个api关于接口的模块,模块里边可以有好几个控制器,例如用户的控制器处理用户登录注册的业务逻辑,商品处理查询商品列表,单个商品详情的业务逻辑等。然后可以创建一个新的模块,用来写当前项目的后台,例如admin模块。

2,json的返回有一个统一的格式,data是当前返回的数据实例,data里边的数据可能有不同,但是data键必须在,然后是message,statusCode或者responseCode。数据请求正确则以,如果请求错误,那么如果数据是数组,data则返回空数组,如果是字典,那么就返回空字典(其实也是数组),例如第五讲里边的格式。

3,日志是必须得一个操作,可以修改日志的路径为当前api的路径,不管当前请求接口错误与否,都在日志中添加一些数据,例如自己总结的数据。

define ("DATE_IP","时间-ip");
define ("API_NAME","接口名称");
define ("PARAMS","接口参数");
define ("API_ERROR","请求错误信息");
define ("REQUEST_METHOD","请求方式");

然后在每个接口里边判断当前接口出现错误的时候,应该写入错误内容。

4,将常用的方法,例如格式化时间,获取当前请求URL啊或者一些方法封装到公共方法工具中,直接调用。

至此ThinkPHPV5.0.3教程完毕,感谢ThinkPHP。

PS:用户手册 http://www.kancloud.cn/manual/thinkphp5

官网:http://www.thinkphp.cn/

获取请求变量的手册:http://www.kancloud.cn/manual/thinkphp5/118044

实例:

common.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------
 
define ("DATE_IP","时间-ip");
define ("API_PATH","请求接口");
define ("PARAMS","接口参数");
define ("API_ERROR","请求错误信息");
define ("REQUEST_METHOD","请求方式");
 
use think\request;
use think\Log;
// 应用公共函数
 
/*
*    ==========日志=============
*/
//写入日志
function LogByApi()
{
    //初始化request
    $request = Request::instance();
    //获取当前请求的URL
    $currentApi = $request->url(true);
    //获取当前时间
    $currentDate = dateByNow();
    //获取当前IP
    $currentIP = $request->ip();
    //获取当前请求方式
    $requestMethod = $request->method();
    //获取当前的请求参数
    $requestParams = array('gets' => $request->get(),'post' => $request->post());
    //写入
    Log::info($currentDate.' - '.$currentIP,DATE_IP);
    Log::info($requestMethod,REQUEST_METHOD);
    Log::info($currentApi,API_PATH);
    Log::info($requestParams,PARAMS);
}
 
//写入错误日志
function LogByApiWithError($errorInfo)
{
    //获取当前请求的URL
    $currentApi = Request::instance()->url(true);
    Log::error($currentApi.' - \''.$errorInfo.'\'');
}
 
/*
*    ==========date=============
*/
 
//根据格式化字符串格式化时间戳
function DateByFormatWithString($formatString)
{
    return date($formatString,time());
}
 
//获取当前格式化的时间
function dateByNow()
{
    return date('Y-m-d H:i:s',time());
}
 
/*
*    ==========API By json=============
*/
 
Basecontroller.php
 
<?php
    namespace app\api\controller;
 
//系统类库
    use think\controller;
 
    use think\Db;
 
    use think\Log;
 
//自定义model
    /**
    *  自定义基类
    */
    class Basecontroller extends Controller
    {
        
        public function _initialize()
        {
            //修改日志保存地址
            Log::init([
                'type'  =>  'File',
                'path'  =>  APP_PATH.'/'.request()->module().'/logs/'
            ]);
            //写入日志,调用公共方法
            LogByApi();
        }
    }
    
?>

Leave a Reply

Required fields are marked *