get(); if ($conn === false) { ZMBuf::$sql_pool->put(null); throw new DbException("无法连接SQL!" . $line); } $result = $conn->query($line) === false ? false : true; ZMBuf::$sql_pool->put($conn); return $result; } catch (DBException $e) { if (ZMBuf::get("sql_log") === true) { $log = "[" . date("Y-m-d H:i:s") . " " . round(microtime(true) - $starttime, 5) . "] " . $line . " (Error:" . $e->getMessage() . ")\n"; Coroutine::writeFile(CRASH_DIR . "sql.log", $log, FILE_APPEND); } Console::warning($e->getMessage()); throw $e; } } /** * @param string $line * @param array $params * @return mixed * @throws DbException */ public static function rawQuery(string $line, $params = []) { if (ZMBuf::get("sql_log") === true) { $starttime = microtime(true); } Console::debug("MySQL: ".$line); try { $conn = ZMBuf::$sql_pool->get(); if ($conn === false) { ZMBuf::$sql_pool->put(null); throw new DbException("无法连接SQL!" . $line); } $ps = $conn->prepare($line); if ($ps === false) { ZMBuf::$sql_pool->put(null); throw new DbException("SQL语句查询错误," . $line . ",错误信息:" . $conn->error); } else { if (!($ps instanceof PDOStatement) && !($ps instanceof PDOStatementProxy)) { var_dump($ps); ZMBuf::$sql_pool->put(null); throw new DbException("语句查询错误!返回的不是 PDOStatement" . $line); } if ($params == []) $result = $ps->execute(); elseif (!is_array($params)) { $result = $ps->execute([$params]); } else $result = $ps->execute($params); if ($result !== true) { ZMBuf::$sql_pool->put(null); throw new DBException("语句[$line]错误!" . $ps->errorInfo()[2]); //echo json_encode(debug_backtrace(), 128 | 256); } ZMBuf::$sql_pool->put($conn); if (ZMBuf::get("sql_log") === true) { $log = "[" . date("Y-m-d H:i:s") . " " . round(microtime(true) - $starttime, 4) . "] " . $line . " " . json_encode($params, JSON_UNESCAPED_UNICODE) . "\n"; Coroutine::writeFile(CRASH_DIR . "sql.log", $log, FILE_APPEND); } return $ps->fetchAll(); } } catch (DbException $e) { if (ZMBuf::get("sql_log") === true) { $log = "[" . date("Y-m-d H:i:s") . " " . round(microtime(true) - $starttime, 4) . "] " . $line . " " . json_encode($params, JSON_UNESCAPED_UNICODE) . " (Error:" . $e->getMessage() . ")\n"; Coroutine::writeFile(CRASH_DIR . "sql.log", $log, FILE_APPEND); } if(mb_strpos($e->getMessage(), "has gone away") !== false) { zm_sleep(0.2); Console::warning("Gone away of MySQL! retrying!"); return self::rawQuery($line, $params); } Console::warning($e->getMessage()); throw $e; } catch (PDOException $e) { if (ZMBuf::get("sql_log") === true) { $log = "[" . date("Y-m-d H:i:s") . " " . round(microtime(true) - $starttime, 4) . "] " . $line . " " . json_encode($params, JSON_UNESCAPED_UNICODE) . " (Error:" . $e->getMessage() . ")\n"; Coroutine::writeFile(CRASH_DIR . "sql.log", $log, FILE_APPEND); } if(mb_strpos($e->getMessage(), "has gone away") !== false) { zm_sleep(0.2); Console::warning("Gone away of MySQL! retrying!"); return self::rawQuery($line, $params); } Console::warning($e->getMessage()); throw new DbException($e->getMessage(), $e->getCode(), $e); } } public static function isTableExists($table) { return in_array($table, self::$table_list); } }