/** * 初始化Redis配置数据和前缓存结构 */ private static function init() { $config = Config::getEnv("database.redis"); if (empty($config)) { throw new \InvalidArgumentException("配置项'database.redis'不能为空"); } $config = (array) $config; $db_conn_name_list = \Qp\Kernel\Database\QpDB::getConnectionNameList(); foreach ($config as $name => $data) { $name = strval($name); if (in_array($name, $db_conn_name_list)) { throw new \InvalidArgumentException("配置项'database.redis'的连接名'{$name}'和其他类型的数据库连接名冲突"); } $data = (array) $data; if (empty($data)) { throw new \InvalidArgumentException("配置项'database.redis.{$name}'必须为非空数组"); } $conn_name = $name; self::handleConfigArr($data, 'host', $host); self::handleConfigArr($data, 'auth', $auth); self::handleConfigArr($data, 'database', $database); self::handleConfigArr($data, 'port', $port); self::handleConfigArr($data, 'prefix', $prefix); $prefix = strval($prefix); if ($prefix == "") { $data['prefix'] = ":"; } else { $data['prefix'] = "_" . $prefix . ":"; } self::$config_list[$conn_name] = new ConfigObj($conn_name, $host, $auth, $database, $port, $data['prefix'], $data); } if (self::$frontCache === null) { self::$frontCache = new \Phalcon\Cache\Frontend\Data(self::$frontCacheData); } }
/** * 判断传入的日志等级是否可以记录 * 允许记录返回true,否则返回false * * @param string $log_level 日志等级 * @return bool */ public static function isLog($log_level) { if (self::$log_mode === null) { $log_mode_config = Config::getEnv("app.log_mode"); if ($log_mode_config < 0 || $log_mode_config > 8) { throw new \InvalidArgumentException("日志模式必须是0到8之间的整数,请检查配置项:app.log_mode"); } self::$log_mode = $log_mode_config; } if (self::$log_mode <= array_search($log_level, self::$log_level_allow)) { return true; } return false; }
/** * 记录起始请求日志 * 记录成功返回true,失败或没记录日志返回false * * @param \Exception|\Throwable $ex * @return bool */ public static function error_log($ex) { if (!BaseLog::isLog('error')) { return false; } if (!Config::getEnv("app.framework_error_log")) { return false; } $data = Request::nonPostParam(); if (Config::getEnv("app.request_log_post")) { $data = Request::param(); } $log_msg = "\r\nQP->Main最外层捕捉到Exception异常:\r\n请求参数:{Param}\r\n异常信息:{E_Msg}\r\n异常位置:{E_Point}\r\n更多异常队列信息:{E_Trace}\r\n"; $log_data = ['Param' => json_encode($data), 'E_Msg' => $ex->getMessage(), 'E_Point' => $ex->getFile() . ":" . $ex->getLine(), 'E_Trace' => json_encode($ex->getTrace())]; return Log::error($log_msg, $log_data, true, 'framework'); }
/** * 返回默认的数据库链接对象 * * @return ConnectionObj */ public function getDefaultConnection() { $config = Config::getEnv('database.default'); if (empty($config)) { throw new \InvalidArgumentException("'database'配置文件中的'default'配置项无效:该配置必须是非空数组"); } $driver_str = isset($config->driver) ? $config->driver : null; $driver = strtolower($driver_str); unset($config->driver); $config = (array) $config; $config['options'] = [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_EMULATE_PREPARES => false, \PDO::ATTR_STRINGIFY_FETCHES => false, \PDO::ATTR_DEFAULT_FETCH_MODE => $this->getDefaultFetch()]; return new ConnectionObj('db', $driver, $config); }
/** * 注册命名空间:除了app目录外,还需要注册用户定义的命名空间 */ private function setNamespace() { // 注册app目录,使其成为prs-4标准注册命名空间 $loader = new \Phalcon\Loader(); $loader->registerDirs(array(QP_APP_PATH)); // 注册用户自定义命名空间 $ns_config = (array) Config::get('app.namespace'); $ns = ['App' => QP_APP_PATH]; foreach ($ns_config as $key => $value) { if ($key == "App") { continue; } $ns[$key] = QP_ROOT_PATH . $value; } $loader->registerNamespaces($ns)->register(); }
/** * QP框架异常处理方式 * * @param \Exception|\Throwable $ex */ public function fatalHandler($ex) { if (Config::getEnv("app.debug")) { echo "<pre>"; echo "Exception : ", $ex->getMessage(), "<br>"; echo "Catch position : " . $ex->getFile() . " : " . $ex->getLine() . "<br><br>"; echo $ex->getTraceAsString(); } else { echo strval(Config::getEnv("app.prod_tip")); } exit; }