* @since 1.0
*/
class CProfile
{
//保存类实例的静态成员变量
private static $_instance;
//private标记的构造方法
private function __construct(){
//echo 'This is a Constructed method;';
}
//创建__clone方法防止对象被复制克隆
public function __clone(){
//trigger_error('Clone is not allow!',E_USER_ERROR);
}
//单例方法,用于访问实例的公共的静态方法
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self;
}
return self::$_instance;
}
# 模块间访问数据的调度方法。
# $obj_data = [ $modules,$file,$function,$is_remote='false' ];
# $req_data = []; 传递的参数
public function fetch($obj_data,$req_data=[]){
if(!is_array($req_data)){
$message = 'fetch($obj_data,$req_data),$req_data must be array';
throw new \yii\web\HttpException(406,$message);
}
$data = '';
if(is_array($obj_data) && !empty($obj_data)){
$modules = $obj_data[0];
$file = $obj_data[1];
$function = $obj_data[2];
$is_remote = $obj_data[3];
if($modules && $file && $function){
$ModulesConfig = $this->getModulesConfig();
if(isset($ModulesConfig[$modules])){
$moduleConfig = $ModulesConfig[$modules];
if($is_remote){
# 远程
# 把模块更新的session更新到redis上面,以供其他模块使用
session_commit();
$data = $this->getRemotePostData($modules,$moduleConfig,$file,$function,$req_data,$timeout = 20);
}else{
# 本地
$file = str_replace("/","\\",$file);
$function_exec = $moduleConfig['moduleDir']."\\o\\".$file;
$function_exec .= "::".$function;
$data = \call_user_func_array($function_exec,$req_data);
$data = CFunc::object_to_array(json_decode($data));
}
}else{
$message = "!! Get Data From Local Module <$modules> Error: Module is not config in Profile.";
throw new \yii\web\HttpException(406,$message);
}
}else{
$message = "!! Get Data From Local Module <$modules> Error: param:obj_data must is array and count >= 3.";
throw new \yii\web\HttpException(406,$message);
}
}else{
$message = "!! Get Data From Local Module <$modules> Error: param:obj_data is Empty OR is not Array .";
throw new \yii\web\HttpException(406,$message);
}
return $data;
}
public function getDefaultToken(){
return CConfig::getDefaultModuleToken();
}
# 得到模块的配置
public function getModulesConfig(){
return [
'DMenu' => [
'moduleDir' =>'\appdata\code\Blog\DMenu',
'apiurl' =>'http://120.24.37.249:100/dmenu',
'token' =>'xxxxxx',
],
];
}
# 得到远程模块信息
public function getRemotePostData($modules,$moduleConfig,$file,$function,$req_data=[],$timeout = 20){
$file = str_replace("\\","/",$file);
$url = strtolower(trim($moduleConfig['apiurl']."/".$file."/".$function));
$module_token = $moduleConfig['token'] ? $moduleConfig['token'] : $this->getDefaultToken();
$post = Yii::$app->request->post() ;
$get = Yii::$app->request->get();
$post = $post ? $post : [];
$get = $get ? $get : [];
$data = array_merge($get , $post);
$data['module_token'] = $module_token;
$data['current_remote_function_param_array'] = serialize($req_data);
$arr = '';
//var_dump($_COOKIE);exit;
if(is_array($_COOKIE)){
foreach($_COOKIE as $k=>$v){
$arr[] = $k."=".urlencode($v);
}
}
if(!empty($arr)){
$strCookie = implode(";",$arr);
}
//对空格进行转义
$url = str_replace(' ','+',$url);
$ch = curl_init();
//设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, "$url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
if($strCookie){
curl_setopt( $ch, CURLOPT_COOKIE, $strCookie );
}
curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
// POST数据
curl_setopt($ch, CURLOPT_POST, 1);
// 把post的变量加上
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
//执行并获取url地址的内容
$output = curl_exec($ch);
//echo $output ;
//释放curl句柄
curl_close($ch);
//var_dump($data['current_remote_function_param_array']);
//var_dump($_COOKIE);
//echo "
";
//var_dump($output);
//echo $url;
//exit;
//$return['ack'] = true;
//$return['ack_description'] = "success";
//$return['content'] = $data;
$return = CFunc::object_to_array(json_decode($output));
if($return['ack']){
return $return['content'];
}else{
$message = "Get Data From Remote Module <$modules> Error:".$return['ack_description'].".";
throw new \yii\web\HttpException(400,$message);
}
//return $output;
}
}