Apple 手机网站制作,银川市做网站的公司,网站建设中如何使用字体,最好的销售管理系统问题出现原因是想对项目中error级别的日志#xff0c;接入钉钉告警#xff0c;方便查看 于是使用钩子方法#xff0c;日志写入完成后#xff0c;自动调用自定义的告警方法中
1、在application/tags.php 中添加log_write_done [app\\common\\behavior\\Common,
],2、在…问题出现原因是想对项目中error级别的日志接入钉钉告警方便查看 于是使用钩子方法日志写入完成后自动调用自定义的告警方法中
1、在application/tags.php 中添加log_write_done [app\\common\\behavior\\Common,
],2、在 common/behavior/Common.php 中添加/**
* 记录日志的钩子方法发送告警信息
* param $log
* return void
*/
public function logWriteDone($log)
{$level ;if (isset($log[notice])) {$level notice;}if (isset($log[error])) {$level error;}if (isset($log[alert])) {$level alert;}//钉钉告警if (in_array($level, [notice, error])) {$method ;if (isset($log[info])) {foreach ($log[info] as $value) {if (strpos($value, PARAM)) {$method $value;}}}$data $log[$level];$message $method . \r\n--------------------\r\n . var_export($data, true);Notice::DingRobot($message, $level);}
}在 Notice::DingRobot($message, $level); 中实现钉钉机器人推送消息代码即可实现告警功能
但是在运行脚本的时候发现程序会内存溢出直到崩溃报错 Allowed memory size of 536870912 bytes exhausted (tried to allocate 262144 bytes) in 正常调用是OK的脚本调用会出现异常百思不得其解于是开启了漫长的debug过程。。。。。。 最后追框架源码发现了问题原因
1、脚本运行时因为会连接数据库所以框架会打sql级别的日志
thinkphp/library/think/Log.php 2、打日志时先是执行到了这个魔术方法中可以看到是调用了record方法 这一步很关键注意看有个IS_CLI 这个是在命令行模式的时候为true 3、然后继续到save里面看 4、save记录完日志后会执行钩子 log_write_done 继续往Hook::listen 方法里面排查 可以看到这里是执行了exec方法 5、到exec里面看看 6、这一步很关键可以看到调用完对应的钩子函数后如果是debug模式会继续打个record日志于是流程就又回到了第一次变成了死循环这就是导致程序内存崩溃的原因
找到问题原因了如何解决呢可以确定是框架bug导致的但是一般来说最好不要直接改框架源码那么就从业务上面入手通过上面的流程可以看出首先是是 IS_CLI 执行大日志的操作然后是debug模式为true时 才会打record日志那么可以在自定义的钩子函数中加上 public function logWriteDone($log)
{if (IS_CLI App::$debug) {App::$debug false;}//发送告警
}如果是命令行模式下把debug设置为false那么就第六步判断的时候debug为false就不会进入死循环中了
问题是再命令行模式 本地debug模式打开的时候会出现这个方法没有根本解决bug是通过绕过的方式解决了这个问题如果有更好的解决方法欢迎留言告知