mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-07 15:12:48 +08:00
Db类增加listen方法 用于监听SQL执行操作 改进Model类事件
This commit is contained in:
@@ -547,22 +547,22 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
|
|||||||
public static function event($event, $callback, $override = false)
|
public static function event($event, $callback, $override = false)
|
||||||
{
|
{
|
||||||
if ($override) {
|
if ($override) {
|
||||||
self::$event[$event] = [];
|
static::$event[$event] = [];
|
||||||
}
|
}
|
||||||
self::$event[$event][] = $callback;
|
static::$event[$event][] = $callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 触发事件
|
* 触发事件
|
||||||
* @access public
|
* @access protected
|
||||||
* @param string $event 事件名
|
* @param string $event 事件名
|
||||||
* @param mixed $params 传入参数(引用)
|
* @param mixed $params 传入参数(引用)
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
protected function trigger($event, &$params)
|
protected function trigger($event, &$params)
|
||||||
{
|
{
|
||||||
if (isset(self::$event[$event])) {
|
if (isset(static::$event[$event])) {
|
||||||
foreach (self::$event[$event] as $callback) {
|
foreach (static::$event[$event] as $callback) {
|
||||||
if (is_callable($callback)) {
|
if (is_callable($callback)) {
|
||||||
$result = call_user_func_array($callback, [ & $params]);
|
$result = call_user_func_array($callback, [ & $params]);
|
||||||
if (false === $result) {
|
if (false === $result) {
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ abstract class Driver
|
|||||||
protected $linkID = null;
|
protected $linkID = null;
|
||||||
// 查询参数
|
// 查询参数
|
||||||
protected $options = [];
|
protected $options = [];
|
||||||
|
// 监听回调
|
||||||
|
protected static $event = [];
|
||||||
|
|
||||||
// 数据库连接参数配置
|
// 数据库连接参数配置
|
||||||
protected $config = [
|
protected $config = [
|
||||||
@@ -2176,17 +2178,53 @@ abstract class Driver
|
|||||||
} else {
|
} else {
|
||||||
// 记录操作结束时间
|
// 记录操作结束时间
|
||||||
Debug::remark('queryEndTime', 'time');
|
Debug::remark('queryEndTime', 'time');
|
||||||
$log = $this->queryStr . ' [ RunTime:' . Debug::getRangeTime('queryStartTime', 'queryEndTime') . 's ]';
|
$runtime = Debug::getRangeTime('queryStartTime', 'queryEndTime');
|
||||||
|
$log = $this->queryStr . ' [ RunTime:' . $runtime . 's ]';
|
||||||
|
$result = [];
|
||||||
// SQL性能分析
|
// SQL性能分析
|
||||||
if (0 === stripos(trim($this->queryStr), 'select')) {
|
if (0 === stripos(trim($this->queryStr), 'select')) {
|
||||||
$result = $this->getExplain($this->queryStr);
|
$result = $this->getExplain($this->queryStr);
|
||||||
Log::record('[ EXPLAIN : ' . var_export($result, true) . ' ]', 'sql');
|
|
||||||
}
|
}
|
||||||
Log::record('[ SQL ] ' . $log, 'sql');
|
// SQL监听
|
||||||
|
$this->trigger($this->queryStr, $runtime, $result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听SQL执行
|
||||||
|
* @access public
|
||||||
|
* @param callable $callback 回调方法
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function listen($callback)
|
||||||
|
{
|
||||||
|
self::$event[] = $callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 触发SQL事件
|
||||||
|
* @access protected
|
||||||
|
* @param string $sql SQL语句
|
||||||
|
* @param float $runtime SQL运行时间
|
||||||
|
* @param mixed $explain SQL分析
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
protected function trigger($sql, $runtime, $explain = [])
|
||||||
|
{
|
||||||
|
if (!empty(self::$event)) {
|
||||||
|
foreach (self::$event as $callback) {
|
||||||
|
if (is_callable($callback)) {
|
||||||
|
call_user_func_array($callback, [$sql, $runtime, $explain]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 未注册监听则记录到日志中
|
||||||
|
Log::record('[ SQL ] ' . $this->queryStr . ' [ RunTime:' . $runtime . 's ]', 'sql');
|
||||||
|
Log::record('[ EXPLAIN : ' . var_export($result, true) . ' ]', 'sql');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 初始化数据库连接
|
* 初始化数据库连接
|
||||||
* @access protected
|
* @access protected
|
||||||
|
|||||||
Reference in New Issue
Block a user