在tp5版本的时候日志中保存了全部的请求信息,保存了请求地址 请求方法 请求路由 请求头 请求参数,但是在tp6中官方取消了。官方解释说由于日志记录了所有的运行错误,因此养成经常查看日志文件的习惯,可以避免和及早发现很多的错误隐患。但是我觉得不方便我定位线上问题,于是把tp5源码中的部分移植到tp6中,tp5中大部分放在tp底层,为了不破坏tp框架我把代码放到中间件中进行继承,所有中间件全部继承此代码。自动记录请求信息。
<?php
declare (strict_types=1);
namespace app\middleware;
use think\facade\Log;
use think\Request;
class Base
{
/**
* 保存请求信息
* Base constructor.
*/
public function __construct()
{
$request = app(Request::class);
$requestInfo = [
'ip' => $request->ip(),
'method' => $request->method(),
'host' => $request->host(),
'uri' => $request->url(),
];
$logInfo = [
"{$requestInfo['ip']} {$requestInfo['method']} {$requestInfo['host']}{$requestInfo['uri']}",
'[ ROUTE ] ' . var_export($this->getRouteInfo(), true),
'[ HEADER ] ' . var_export($request->header(), true),
'[ PARAM ] ' . var_export($request->param(), true),
'---------------------------------------------------------------',
];
$logInfo = implode(PHP_EOL, $logInfo) . PHP_EOL;
Log::record($logInfo, 'info');
}
/**
* 获取路由信息
* @return array
*/
protected function getRouteInfo(): array
{
$request = app(Request::class);
return [
'rule' => $request->rule()->getRule(),
'route' => $request->rule()->getRoute(),
'option' => $request->rule()->getOption(),
'var' => $request->rule()->getVars(),
];
}
}以上代码从Tp5查看源码实现的。所有中间件都继承base即可。生成的日志和tp5完全一样
[2021-07-07T21:09:50+08:00][info] 127.0.0.1 POST learn.cn/api/v3/up_professions
[ ROUTE ] array (
'rule' => 'v3/up_professions',
'route' => 'api/User/update',
'option' =>
array (
'remove_slash' => false,
'merge_rule_regex' => false,
'middleware' =>
array (
0 => 'app\\middleware\\CheckLogin',
),
),
'var' =>
array (
),
)
[ HEADER ] array (
'accept-encoding' => 'gzip, deflate',
'accept' => '*/*',
'token' => 'fjsfnsjdfneofnjsnsfgjnsga',
'content-type' => 'application/json',
'content-length' => '2',
'connection' => 'keep-alive',
'host' => 'learn.cn',
)
[ PARAM ] array (
)
---------------------------------------------------------------
function objtoarr($obj){ $ret = array(); foreach($obj as $key =>$value){ if(gettype($value) == 'arr...
在项目中需要对图片进行裁剪,前端裁剪完成发送base64给后端,但是很意外的PHP获取到的数据和前端有点差距,之前我都是先加密,后端解密,但是这次依然不行。于是使用filter_input方法轻松解决。$base64 = filter_input(INPUT_POST...
md5/sha1+salt方式是目前各大cms常用的加密方式,虽然salt安全,但是各大md5网站也在研究这个方向,那么我们应该选择password_hash动态hash来助力,一种密码有多种hash结果.看代码模拟登陆.<?php //01.注册 $user ='zhang...
(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习: (2.1)pcntl_fork()执行时: &nbs...
有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...
断点下载的原理:http请求头添加Range参数告诉文件服务器端需要的字节范围例如1个文本文件的字节为1000,第一次请求Range: bytes=0-500第二次请求Range: bytes=501-1000通过每次的请求将返回的流追加写入到文件。注意的项目:断点下载服务器端的每次只返回字节传输的...