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.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();
}
}
?>

