标识 | 说明 |
---|---|
local | 本地,不在版本库中,自行在本地配置 |
dev | 开发环境 |
qa1/qa2/qa3/qa4 |
集成测试环境 |
sit | 回归测试环境 |
prod | 生产环境 |
cli
vim /etc/profile #添加
export WEB_ENV='dev'
web
vim nginx_path/nginx/fastcgi_params #添加fastcgi参数
fastcgi_param WEB_ENV 'dev';
使用composer加载xyf-php-lib
,命名空间为yiqiang3344\yii2_lib
.
库中定义了常用的中台SDK,比如:消息中心;还有常用的工具类,比如:配置文件、数据库、web请求、加密、OSS、Redis、参数校验、状态码,以及数组、字符串、金额、图片和时间等。
具体参见:
xyf-php-lib介绍
xyf-php-lib开发规范
修改common/config/bootstrap.php
中的全局变量PROJECT_NAME
对应项目标识,一般为项目名对应的值。
公共目录:common/config/
应用目录:应用文件夹/config/
环境目录:应用文件夹/config/环境标识/
优先级:环境配置>应用配置>公共配置。 其中应用目录的环境配置优先级高于公共目录的环境配置。
公共的通过脚手架自动生成的数据表对应的类,不能做任何修改。
公共的模型,可继承数据表对应的类,也可以实现各种设计模式,但请根据业务建立对应的目录,以便和其他业务区分。
与业务无关的通用工具,比如数组、字符串、校验、加密等。
相对独立的业务的门面类,门面类的业务逻辑对外是透明的。
公用的异常类。
公共过滤器,主要用在各应用的BaseController::behaviors
中。
公用的秘钥信息。
无法通过composer引入的多文件工具类。
日志统一写到@customLog
中,在common/config/bootstrap.php
中配置。
Yii::setAlias('@customLog', '/data/logs/' . PROJECT_NAME);
也可以在各应用目录或环境目录的bootstrap.php
中根据需要设置。
目前日志是写入各服务器文件,通过logstash收集到阿里云日志服务。为了方便通过阿里云日志服务查询和分析,日志统一采用json格式。
可参考使用 common\logging\JsonFileTarget
将日志使用json格式记录。
日志单个文件大小上限为1G,最多有5个同名的日志文件。配置方法:
\common\logging\FileTarget::$maxFileSize = 1024 * 1024;
\common\logging\FileTarget::$maxLogFiles = 5;
common/config/main.php
中的components.log.targets
中配置,也可以在各级配置目录中按需求配置,下面是常用配置说明:
属性 | 实例 | 说明 |
---|---|---|
class | common\logging\JsonFileTarget |
日志文件类 |
levels | ['info'] |
包含的日志级别 |
categories | ['web_client'] |
包含的日志类型 |
except | ['yii\base\UserException'] |
不包含的日志类型 |
logVars | ['_POST'] |
要显示的参数变量,为空表示不显示,可选值:_GET, _POST, _FILES, _COOKIE, _SESSION 和 _SERVER |
exportInterval | 1 |
导出间隔,生产的web要配置为大于或等于1000,否则频繁写入日志会影响性能 |
logFileParams | ['base_path' => '@customLog/web_client','format' => 'Ymd'] |
日志文件路径配置,其中base_path 表示日志目录,format 日志文件日志命令格式 |
ignoreLog | true |
是否忽略匹配的日志,可用来暂时忽略匹配规则 |
字段 | 类型 | 必填 | 备注 |
---|---|---|---|
time | string | 必填 | 日志记录时间,格式:yyyy-mm-dd hh:mm:ss |
message_tag | string | 选填 | 日志标签,用来区分业务及其子类,尽量用唯一的方便查询的标识 |
message | `string | array` | 必填 |
request_float_number | string | 必填 | 请求流水号,同一个web请求的所有日志流水号都一致,常驻进程需要自行刷新流水号 |
ip | string | 必填 | 客户端ip |
level | string | 必填 | 日志级别:info 信息,warning 警告,error 错误 |
category | string | 必填 | 类型 |
host_name | string | 必填 | 服务器名称 |
debug | array | 选填 | 追踪信息,写日志位置的前3层路径 |
为了方便跨项目排查问题,各项目尽量使用统一的日志目录规范。
一下日志目录规范的日志匹配配置,都已在common/config/bootstrap.php
中配置。
日志匹配规则配置好之后,只需要调用\Yii::info('message', $category)
即可写入日志。
为了方便管理,common\logging
中已经封装好对应的日志类,方便调用。
可通过controller
继承\common\controllers\BaseController
或use yiqiang3344\yii2_lib\helper\log\TAccessLog
实现。
非常驻进程会记录请求信息和响应信息,常驻进程只请求信息,是否是常驻进程可参考下文中的常驻进程章节。
可通过controller
继承\console\controllers\BaseController
实现。
调试日志,统一使用\common\logging\DebugLog
的error()
、info()
和warning()
来写入日志。
使用yii自带数据库操作类,异常类型为yii\db\*
,会命中对应日志匹配规则,并记录到此目录中。
使用yiqiang3344\yii2_lib\helper\webClient\WebClientV2
或yiqiang3344\yii2_lib\helper\webClient\WebClient
发起的请求会自动记录日志。
使用yiqiang3344\yii2_lib\helper\webClient\WebClientV2
或yiqiang3344\yii2_lib\helper\webClient\WebClient
发起的请求会自动记录日志。
代码异常的错误日志,一般需要排除掉业务异常。
这是兜底的,保证其他规则都没匹配到的日志会落到这里来。确定没用的日志,可通过except
过滤。
在日志匹配规则基础上,通过把class
配置为common\logging\EmailTarget
,可以通过消息中心,把错误信息发送到钉钉群及指定人员的邮箱中。
匹配规则示例:
[
'class' => 'common\logging\EmailTarget',
'levels' => ['error'], //包含的错误级别
'except' => [ //忽略的日志类型
'yii\web\HttpException:404',
'yii\web\HttpException:400',
'yii\web\HttpException:403',
'yiqiang3344\yii2_lib\helper\exception\ParamsInvalidException',
'yiqiang3344\yii2_lib\helper\exception\OptionsException',
'common\exception\CUserException',
'yiqiang3344\yii2_lib\helper\exception\UserException',
'yii\base\UserException',
],
'message' => [
'from' => ['sms-api'], //随便配置一个,不能为空
'subject' => '[' . $_SERVER['WEB_ENV'] . '][' . gethostname() . ']['. PROJECT_NAME .']', //公共主题
],
],
通过\common\helper\Env::$globalAttributes
来定义可以全局配置的变量。
通过\common\helper\Env::setAttr()
方法来定义。
通过定义对应的get方法来使用,不能直接从\common\helper\Env::$globalAttributes
读取,因为全局变量很可能是需要二次处理的。
为了方便统一管理响应信息的http状态码以及影响参数,统一使用错误异常捕获类\common\error\ErrorHandler
来处理异常。
响应状态码统一使用\common\helper\CodeMessage
来处理响应值。
具体参考:接口响应规范
多http状态码响应可通过配置关闭: common/config/params.php
'switch' => [
'response' => [
'httpStatus' => false,
],
],
v2版本
参考\api\controllers\TestController
v3.1版本
参考\api\controllers\TestV3Controller
基于yii2的事件组件:https://www.yiichina.com/doc/guide/2.0/concept-events,
封装了\yiqiang3344\yii2_lib\helper\event\Event
事件门面类。
事件类:需要继承yii\base\Event
监听者类:需要实现\yiqiang3344\yii2_lib\helper\event\ListenerInterface
接口
在项目配置的components下配置事件及监听者,示例:
'event' => [
'class' => \yiqiang3344\yii2_lib\helper\event\Event::class,
'listen' => [
\yiqiang3344\yii2_lib\helper\event\events\SlowSqlEvent::class => [
\common\event\listeners\SlowSqlAlter::class,
],
],
],
触发事件:
\yiqiang3344\yii2_lib\helper\event\Event::event(new \yiqiang3344\yii2_lib\helper\event\events\SlowSqlEvent([
'sql' => $rawSql,
'cost' => $cost,
'slowSqlTime' => 2,
]));
为了方便记录脚本执行日志,把控制器分为常驻进程和非常驻进程; 比如:
- 订单非常驻进程:
console/controllers/OrderController.php
- 订单常驻进程:
console/controllers/LpOrderController.php
注意: 使用常驻进程的controller和不使用常驻进程的controller要分开,这样才能正确的记录脚本执行日志。 因为非常驻进程如果有异常,执行记录会包含异常结果, 但常驻进程运行时间太长,会先记录执行记录,如果有异常再额外记录一条异常日志,两条记录
request_float_number
是一致的。
对应controller
中use \console\models\LongProcessTrait
,
然后可使用longProcess(callable $callback)
实现常驻进程,使用kill -15 pid
来安全终止进程。
即使不用longProcess()
方法来实现常驻进程,为了保证日志正常记录,对应controller
也需要use \console\models\LongProcessTrait
。
推荐使用\common\helper\Validator::checkParams(&$params, $needParams)
方法来校验输入参数。
支持的参数类型参见\common\helper\Validator::$builtInValidators
列表,且可自行扩展。
比如:
$params = $this->request->getBodyParams();
Validator::checkParams($params, [
'test' => ['name' => '测试', 'type' => 'string']
]);
推荐使用\common\facade\Config
来管理。
本地文件配置可直接使用\common\helper\config\Config
来获取\Yii::$app->params
的参数,支持用点来分隔数组。
比如,下面两个结果一样。
var_dump(common\helper\config\Config::getString('secret.self_sign_key', ''));
var_dump(\Yii::$app->params['secret']['self_sign_key'] ?? '');
\common\helper\db\DB 数据库管理类
yii2默认数据库连接为common/config/环境/db.php
中的db,可通过Yii::$app->db
来使用,
但其他数据库配置,比如db2
,虽然也可以通过Yii::$app->db2
使用,但没有注释定义,所有没有语法提示。
为了增强使用体验,建议在\common\helper\db\DB
中给每个数据库创建一个方法来连接。
比如:\common\helper\db\DB::default()
为默认数据库连接,\common\helper\db\DB::db2()
为db2
的数据库连接。
事务 可使用yii2自带的事务方式:
$t = DB::default()->beginTransaction();
$t->rollBack();
$t->commit();
也可以使用兼容信用飞老框架的方法:
\common\helper\db\DB::transaction($callback, Connection $connection = null);
\common\facade\Sms::send($mobile, $templateId, $data, $app, $innerApp, $channel = '', $notifyUrl = '')
发送\common\facade\Captcha::sendSmsCode($mobile, $bizType)
校验\common\facade\Captcha::validate($mobile, $bizType, $captcha)
db配置中class替换为\yiqiang3344\yii2_lib\helper\db\Connection::class
,增加slowSqlTime
表示超过多少秒算慢sql(也可以不配置,自行在监听者中判断),示例:
'db' => [
'class' => \yiqiang3344\yii2_lib\helper\db\Connection::class,
'slowSqlTime' => 2,
'dsn' => 'mysql:host=mysql;dbname=dbname',
'username' => 'user',
'password' => 'password',
'charset' => 'utf8',
'tablePrefix' => '',
],
在项目配置的components下配置事件及监听者,示例:
'event' => [
'class' => \yiqiang3344\yii2_lib\helper\event\Event::class,
'listen' => [
\yiqiang3344\yii2_lib\helper\event\events\SlowSqlEvent::class => [
\common\event\listeners\SlowSqlAlter::class,
],
],
],
日志配置中db目录捕获慢sql日志,app目录中忽略慢sql日志:
[
'class' => 'common\logging\JsonFileTarget',
'levels' => ['error', 'warning'],
'logVars' => [],
'except' => [
'yii\httpclient\*',
'yiqiang3344\yii2_lib\helper\exception\ParamsInvalidException',
'yiqiang3344\yii2_lib\helper\exception\OptionsException',
'common\exception\CUserException',
'yiqiang3344\yii2_lib\helper\exception\UserException',
'yii\base\UserException',
'yii\base\InvalidRouteException',
'slowSql', //增加slowSql
],
'exportInterval' => $_exportInterval,
'logFileParams' => [
'base_path' => '@customLog/app',
'format' => 'Ymd',
],
],
[
'class' => 'common\logging\JsonFileTarget',
'levels' => ['error', 'warning'],
'categories' => ['yii\db\*', 'slowSql'], //增加slowSql
'logVars' => [],
'exportInterval' => $_exportInterval,
'logFileParams' => [
'base_path' => '@customLog/db',
'format' => 'Ymd',
],
],
\common\event\listeners\SlowSqlAlter::handle()
中实现了日志记录及预警逻辑。