1.token 到时失效。没有实时更新。(通过暂时延长生效时间临时解决)
2.类的封装。面向对象,访问moka 北森的接口交互,封装成对应的可拆解的类。接口 封装成对应的方法。
(请求接口 记录对应的 参数和返回值 到 日志表 留存)日志入库方法封装类。
优化:统一的日志服务。阿里云 或 ELk。 可以快速定位问题。
问题:重要入库请求,要记录日志,防止丢请求时溯源。 before 和after 都要加。
3.快速记录文件日志代码模板
$logStr = sprintf('step:RemitBank,admin_id:%s,post:%s',$admin_id,$postData);
$this->toLog($logStr);
private function toLog($string = '') {
//$basePath = Yii::app()->basePath;
$path = pathinfo(__FILE__);
//设置路径目录信息
$url = $path['dirname'] . '/../../../runtime/log_' . date('Ymd') . '.log';
$dir_name = dirname($url);
//目录不存在就创建
if (!file_exists($dir_name)) {
$res = mkdir(iconv("UTF-8", "GBK", $dir_name), 0777, true);
}
$fp = fopen($url, "a");
fwrite($fp, date('Y-m-d H:i:s') . " " . $string . "\r\n");
fclose($fp);
}
$logStr = sprintf('step:access_log, actionId:%s #@@# tk:%s #@@# uid:%s #@@# rawBody:%s', $url, $access_token, $uid, $param_json);
ToLog::write($logStr);
class ToLog extends Component
{
public static function write($data){
if( is_array($data) ){
$data = json_encode($data);
}
//设置路径目录信息
$url = \Yii::$app->getRuntimePath() . '/logs/business/' . date('Y-m-d') . '.log';
$dir_name = dirname($url);
//目录不存在就创建
if (!file_exists($dir_name)) {
//iconv防止中文名乱码
$res = mkdir(iconv("UTF-8", "GBK", $dir_name), 0777, true);
}
$fp = fopen($url, "a");//打开文件资源通道 不存在则自动创建
fwrite($fp, date('Y-m-d H:i:s') . " " . var_export($data, true) . "\r\n");//写入文件
fclose($fp);//关闭资源通道
}
}
4.model 和 service 的合理封装。公用的方法类的封装。
5.对接外边项目。对接飞书端接口。看飞书文档。产品文档。
6.指定日报模板。每日更新日报和问题汇总。
7. mysql 的null, 用 is null ,is not null,判断。 大于小于 等于和count 都筛不到null的记录。
连表时 on 右边条件不满足,也能筛出来, 和where 不满足 会过滤掉 的区别。
8.打款接口,1.做不可重复请求校验2.做一段时间一个账单只能打一次校验。防止重复提交和重复操作。
9.RPC的好处,直接写到model 就能被远程调用。 传参和返回值解析,就和调用本地方法一样。
10.检测定时任务异常时发邮件提醒
(new ToLog())->registerShutdown();
/**
* 处理函数
* 2020/12/10
*/
public function Shutdown(){
$error=error_get_last();
// var_dump($error);
if($error!==null){
$date= [$error['message'], $error['type'], $error['file'], $error['line']];
self::sendMail($error);
self::logException($date);
}
}
/**
* 注册处理函数
* 2020/12/10
*/
public function registerShutdown(){
register_shutdown_function([$this,'Shutdown']);
restore_error_handler();
}
public static function sendMail($error){
$text = "<p style='font-weight: bold;'>脚本名称: " . implode(' ',$_SERVER['argv']) . "</p>";
if(is_array($error)){
$text.= "<p>type:" . $error['type'] . "</p>";
$text .= "<p>message:" . $error['message'] . "</p>";
$text .= "<p>file:" .$error['file'] . "</p>";
$text .= "<p>line:" . $error['line'] . "</p>";
}elseif($error instanceof \Throwable){
$text.= "<p>code:" . $error->getCode() . "</p>";
$text .= "<p>message:" . $error->getMessage() . "</p>";
$text .= "<p>file:" .$error->getFile() . "</p>";
$text .= "<p>line:" .$error->getLine(). "</p>";
$text .= "<p>Trace:" .str_replace('#',"<br>#",$error->getTraceAsString()). "</p>";
}
\Helper::sendMail(['xxx@126.com'],"脚本错误报警",$text);
}
11.获取异常调动链信息
$error->getLine()
$error->getTraceAsString())
12.不合理的问题,不要的代码 要及时删除。开发阶段的修改,比测试和上线后的修改,成本和风险都小。
13.注意代码或者sql的执行顺序。会影响最终结果。