在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 (
)
---------------------------------------------------------------
PHP的session文件夹默认保存在同一个文件,随着访客的增多,访问的速度会非常慢,例如部分管理系统后台每天登陆1000次,1个月就创建了30000个session文件,一年后是多少?假设这个系统的用户是上万人呢?方法1:每个网站使用自己的session文件夹,代码如下:<?php $pat...
开启错误提示代码:ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);关闭错误提示代码:error_reporting(E_ALL ^&n...
先在centos安装openssl,然后开始://生成私钥openssl genrsa -out rsa_private_key.pem 1024//生成公钥openssl rsa -in rsa_private_key.pem&...
源码:特别适用于微信支付中通知微信支付网关function array2xml($arr, $level = 1) { $s = $level == 1 ? "<xml&g...
【一】.介绍session由于HTTP是无状态的请求,创建一个会话需要保持必须需要身份标识。当用户第一次访问,PHP会为用户创建一个唯一的sessionid,并将sessionid通过cookie发送给浏览器,并在服务器的临时文件创建一个以sessionid为名的文件用来保存这个sessionid保...
主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /** * 订单任务 */ class Order { &n...