Commit 32fc2d84 by 王召彬

配置中心

parent 25ca5a04
......@@ -7,155 +7,146 @@ use Swoft\App;
class CfgCenter
{
const COS = 'cos';
const CLS = 'cls';
const CMQ = 'cmq';
const ENCRYPT_KEY = 'encrypt_key';
const BACKEND_WEAPP = 'backend_weapp';
const FRONTEND_WEAPP = 'frontend_weapp';
const ALIYUN_SMS = 'aliyun_sms';
const TENCENT_SMS = 'tencent_sms';
const MP = 'mp';
const PAY = 'pay';
const PAY_YUNMAI = 'pay_yunmai';
const PAY_YUNMAI_ISP = 'pay_yunmai_isp';
const PAY_ZHIMEI = 'pay_zhimei';
/**
* 读取指定的配置项 - 返回对象格式
* 读取指定的配置项 - 返回数组格式
* (所有配置项,需预先添加到数据库中)
* 方法一:
* $value = CfgCenter::get('qCloud>Weapp>Region');
* var_dump($value); // 输出:ap-shanghai
* 方法二:
* $cfgdata = CfgCenter::get('qCloud');
* var_dump($cfgdata->Weapp->Region); // 输出:ap-shanghai
* $cfgdata = CfgCenter::getArray(CfgCenter::COS);
* var_dump($cfgdata['Weapp']['Region']); // 输出:ap-shanghai
*
* @param string $keyStr
* @param string $default 默认返回值
* @param string $keyName
* @param int $oemId oemId==1表示是活动啦啦
* @return mixed
*/
public static function get($keyStr, $default = '', $oemId = 1)
public static function getArray($keyName, $oemId = 1)
{
$data = self::_get($keyStr, $oemId);
if ($data == '') {
return $default;
}
return $data;
return self::_get($keyName, $oemId);
}
/**
* 读取指定的配置项 - 返回数组格式
* (所有配置项,需预先添加到数据库中)
* 方法一:
* $value = CfgCenter::get('qCloud>Weapp>Region');
* var_dump($value); // 输出:ap-shanghai
* 方法二:
* $cfgdata = CfgCenter::get('qCloud');
* var_dump($cfgdata['Weapp']['Region']); // 输出:ap-shanghai
* 根据storeId获取所属OEM平台的配置
*
* @param string $keyStr
* @param string $default 默认返回值
* @param int $oemId
* @param string $keyName
* @param string $storeId
* @return mixed
*/
public static function getArray($keyStr, $default = '', $oemId = 1)
public static function getByStoreId($keyName, $storeId)
{
$data = self::_get($keyStr, $oemId);
if ($data == '') {
return $default;
}
if (is_object($data)) {
return json_decode(json_encode($data), true);
}
return $data;
$dbConn = self::_dbConnect('seller');
$result = $dbConn->get("seller", ['oemId'], ['storeId' => $storeId]);
return self::_get($keyName, (int)$result['oemId']);
}
public function getByUnionId($keyStr, $unionId)
/**
* 根据sellerId获取所属OEM平台的配置
*
* @param string $keyName
* @param string $sellerId
* @return mixed
*/
public static function getBySellerId($keyName, $sellerId)
{
$dbConn = self::dbConnect();
$result = $dbConn->select("seller", ['oemId'], ['unionId' => $unionId]);
return self::_get($keyStr, $result['oemId']);
$dbConn = self::_dbConnect('seller');
$result = $dbConn->get("seller", ['oemId'], ['sellerId' => $sellerId]);
return self::_get($keyName, (int)$result['oemId']);
}
public function getByStoreId($keyStr, $storeId)
/**
* 根据unionId获取所属OEM平台的配置
*
* @param string $keyName
* @param string $unionId
* @return mixed
*/
public static function getByUnionId($keyName, $unionId)
{
$dbConn = self::dbConnect();
$result = $dbConn->select("seller", ['oemId'], ['storeId' => $storeId]);
return self::_get($keyStr, $result['oemId']);
$dbConn = self::_dbConnect('seller');
$result = $dbConn->get("seller", ['oemId'], ['unionId' => $unionId]);
return self::_get($keyName, (int)$result['oemId']);
}
public function getBySellerId($keyStr, $sellerId)
/**
* 获取支付平台证书
*
* @param integer $storeId
* @param integer $isEntrusted 是否是用户托管的小程序
* @return void
*/
public static function getCertByStoreId(int $storeId, int $isEntrusted)
{
$dbConn = self::dbConnect();
$result = $dbConn->select("seller", ['oemId'], ['sellerId' => $sellerId]);
return self::_get($keyStr, $result['oemId']);
$dbConn = self::_dbConnect('seller');
$result = $dbConn->get("seller", ['oemId'], ['storeId' => $storeId]);
$oemId = (int)$result['oemId'];
}
private static function _get($keyStr, $oemId = 1)
private static function _get($keyName, int $oemId = 1)
{
$keyArr = self::parseKeyStr($keyStr);
$rkey = implode(":", $keyArr);
$prefix = "CONFIG_CENTER:oemid_$oemId:";
$redis = App::getBean(Redis::class);
$data = $redis->get("CONFIG_CENTER:$oemId:" . $rkey);
if ($data === null) {
$res = self::dbFetch($keyStr, $oemId);
if ($res) {
if (is_object($res[1])) {
$val = json_encode($res[1]);
$data = $redis->get($prefix . $keyName);
if($data) {
$result = json_decode($data, true);
return is_array($result) ? $result : $data;
}
// 没有缓存则从数据库读取:
$valArr = self::_getConfigFromDb($keyName, $oemId);
if ($valArr) { //有内容时进行redis缓存
if (is_array($valArr)) {
$redis->set($prefix . $keyName, json_encode($valArr), 3600);
} else {
$val = $res[1];
}
$redis->set("CONFIG_CENTER:" . $res[0], $val, 3600);
return $res[1];
$redis->set($prefix . $keyName, $valArr, 3600);
}
}
$obj = json_decode($data);
if ($obj && is_object($obj)) {
return $obj;
}
return $data;
return $valArr;
}
protected static function dbFetch($keyStr, $oemId)
private static function _getConfigFromDb($keyName, $oemId)
{
$keyArr = self::parseKeyStr($keyStr);
$name = array_shift($keyArr);
$dbConn = self::dbConnect();
$result = $dbConn->select("config", ['name', 'value'], ['name' => $name, 'oemId' => $oemId]);
$dbConn = self::_dbConnect('config_center');
$result = $dbConn->select("config", ['name', 'value'], ['oemId' => $oemId, 'name' => $keyName]);
if (!isset($result[0]['value'])) {
return;
}
$valObj = json_decode($result[0]['value']);
if (!is_object($valObj)) {
return [$name, $result[0]['value']];
}
$keys = '';
foreach ($keyArr as $key) {
if (!isset($valObj->$key)) {
return;
}
$keys .= $key . ':';
$valObj = $valObj->$key;
$valArr = json_decode($result[0]['value'], true);
if (!is_array($valArr)) {
return $result[0]['value'];
}
$rkey = $name . ':' . trim($keys, ':');
return [trim($rkey, ':'), $valObj];
return $valArr;
}
public static function dbConnect()
private static function _dbConnect($database)
{
if (\env('ENVIRONMENT', '') == '') {
// 返回线上数据库连接
return new \Medoo\Medoo([
'database_type' => 'mysql',
'database_name' => 'config_center',
'database_name' => $database,
'server' => '172.21.0.12',
'username' => 'configer',
'password' => 'Cfgsu#2390f*_',
'charset' => 'utf8'
]);
} elseif (\env('ENVIRONMENT', '') == 'pre') {
// 返回测试数据库连接
return new \Medoo\Medoo([
'database_type' => 'mysql',
'database_name' => 'config_center',
'server' => '192.168.3.201',
'username' => 'hdller',
'password' => 'Hdlltest999',
'charset' => 'utf8'
]);
} else {
// 返回测试数据库连接
return new \Medoo\Medoo([
'database_type' => 'mysql',
'database_name' => 'config_center',
'database_name' => $database,
'server' => '192.168.3.202',
'username' => 'hdller',
'password' => 'Hdlltest888',
......@@ -164,21 +155,5 @@ class CfgCenter
}
}
protected static function parseKeyStr($keyStr)
{
$keyArr = explode(">", trim($keyStr, '>'));
foreach ($keyArr as $k => $v) {
$v = trim($v);
if ($v == "") {
unset($keyArr[$k]);
} else {
$keyArr[$k] = $v;
}
}
if (empty($keyArr)) {
throw new \Exception("[CfgCenter]未指定合法的Key");
}
return $keyArr;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment