Db类增加listen方法 用于监听SQL执行操作 改进Model类事件

This commit is contained in:
thinkphp
2016-04-10 14:17:54 +08:00
parent ecf2bf50e5
commit 9ac9d43a46
2 changed files with 46 additions and 8 deletions

View File

@@ -547,22 +547,22 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
public static function event($event, $callback, $override = false)
{
if ($override) {
self::$event[$event] = [];
static::$event[$event] = [];
}
self::$event[$event][] = $callback;
static::$event[$event][] = $callback;
}
/**
* 触发事件
* @access public
* @access protected
* @param string $event 事件名
* @param mixed $params 传入参数(引用)
* @return bool
*/
protected function trigger($event, &$params)
{
if (isset(self::$event[$event])) {
foreach (self::$event[$event] as $callback) {
if (isset(static::$event[$event])) {
foreach (static::$event[$event] as $callback) {
if (is_callable($callback)) {
$result = call_user_func_array($callback, [ & $params]);
if (false === $result) {

View File

@@ -46,6 +46,8 @@ abstract class Driver
protected $linkID = null;
// 查询参数
protected $options = [];
// 监听回调
protected static $event = [];
// 数据库连接参数配置
protected $config = [
@@ -2176,17 +2178,53 @@ abstract class Driver
} else {
// 记录操作结束时间
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性能分析
if (0 === stripos(trim($this->queryStr), 'select')) {
$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