config = array_merge($this->config, $config); } $dsn = $this->parseDsn($config); $pdo = $this->createPdo($dsn, $config['username'], $config['password'], $config['params']); $this->pdo = $pdo; $this->tableName = $config['prefix'] . 'debug_log'; } public function save(array $log): bool { $app_name = app('http')->getName() ?: ''; $controller_name = request()->controller(); $action_name = request()->action(); if (App::runningInConsole()) { $app_name = 'cli'; } $create_time = time(); $create_time_title = date('Y-m-d H:i:s', $create_time); $log_key = uniqid(); $columns = 'level,content,create_time,create_time_title,uid,app_name,controller_name,action_name'; $placeholders = '?,?,?,?,?,?,?,?'; $sql = "INSERT INTO {$this->tableName} ({$columns}) VALUES ({$placeholders})"; $stmt = $this->pdo->prepare($sql); foreach ($log as $log_level => $log_list) { foreach ($log_list as $key => $log_item) { if (!is_string($log_item)) { $log_item = json_encode($log_item, JSON_UNESCAPED_UNICODE); } $stmt->execute([ $log_level, $log_item, $create_time, $create_time_title, $log_key, $app_name, $controller_name, $action_name, ]); } } return true; } /** * 解析pdo连接的dsn信息 * @access protected * @param array $config 连接信息 * @return string */ protected function parseDsn(array $config): string { if (!empty($config['socket'])) { $dsn = 'mysql:unix_socket=' . $config['socket']; } elseif (!empty($config['hostport'])) { $dsn = 'mysql:host=' . $config['hostname'] . ';port=' . $config['hostport']; } else { $dsn = 'mysql:host=' . $config['hostname']; } $dsn .= ';dbname=' . $config['database']; if (!empty($config['charset'])) { $dsn .= ';charset=' . $config['charset']; } return $dsn; } protected function createPdo($dsn, $username, $password, $params) { return new PDO($dsn, $username, $password, $params); } public function __destruct() { $this->pdo = null; } }