php专区

 首页 > php专区 > 正则表达式 > uc_client与ucenter通信原理 - UCenter

uc_client与ucenter通信原理 - UCenter

分享到:
【字体:大 中 小】
导读:
          以用户登录为例介绍,其它注销,改密码,消息,头像,好友均类同 1 从用户xxx在某一应用程序的login php,输入用户名,密码讲起。先用uc_user_lo...

uc_client与ucenter通信原理

以用户登录为例介绍,其它注销,改密码,消息,头像,好友均类同.

1.从用户xxx在某一应用程序的login.php,输入用户名,密码讲起。

先用uc_user_login函数到uc server验证此用户和密码,如正确,则写入session,写入cookies,并更新应用程序会员表中的登录ip,登录时间。用户感觉不到这个过程。

2.然后通过uc_user_synlogin通知uc server 用户xxx登录成功,这个过程可能使用ajax,用户感觉不到通知过程。

3.uc server收到这个消息后,马上命令手下,把xxx登录的消息,像令牌环一样,发给所有愿意接收(后台中那个是否开启同步登录)这个消息的其它应用程序。其实就是带参数访问一下各应用程序的uc.php,用户感觉不到这个过程。

4.各应用程序靠api下的uc.php来接收uc server发来的消息,并对uc server言听计从,让干什么就干什么。现在,收到让xxx用户在你的程序中登录的命令,马上执行。

并写本应用程序的session,并且使用p3p, 写入相同域或不同域的cookies.   用户感觉不到这个过程。

5.最后所有和uc整合的程序,xxx均登录成功。用户从www.test.com/bbs登录后, 跳到www.test.com/news同样显示登录。因为bbs 和news系统在后台均已登录。

6.应用程序与uc server的会话结束。

得益于uc设计的精巧过程,整个过程,用户完全感觉不到ucenter的存在.这是整合程序历史上的创新。

以下为其中的一个例子:

Supesite的uc_client和ucenter登录通信过程

1、登录入口Index.php?action-login

  1. //系统频道 
  2. if($_SGET['action'] != 'index') {      
  3. if(emptyempty($channels['menus'][$_SGET['action']]['upnameid']) && $channels['menus'][$_SGET['action']]['upnameid'] != 'news') { 
  4. $scriptfile = S_ROOT.'./'.$_SGET['action'].'.php'; 
  5. } else { 
  6. $scriptfile = S_ROOT.'./news.php'; 
  7. } 
  8.      //echo   $scriptfile; 
  9. if(file_exists($scriptfile)) { 
  10. include_once($scriptfile); 
  11. exit(); 
  12. } 
  13. } 

登录控制器:Login.php

登录视图:Site_login.html.php

提交登录action:batch.login.php?action=login

2、登录处理地址batch.login.php?action=login

include_once(S_ROOT.'./uc_client/client.php');

登录操作及其中涉及到的一些函数:

$password = $_POST['password'];

$username = $_POST['username'];

去ucenter进行远程登录验证

$ucresult = uc_user_login($username, $password, $loginfield == 'uid');

如果登录成功,则查本地用户信息,如果有更新本地信息,如果没有插入新的用户数据保持与ucenter进行同步,然后同步其他子系统登录信息:

  1. $msg = $lang['login_succeed'].uc_user_synlogin($members['uid']); 
  2.  
  3. function uc_user_synlogin($uid) { 
  4. $uid = intval($uid); 
  5. $return = uc_api_post('user', 'synlogin', array('uid'=>$uid)); 
  6. return $return; 
  7. } 
  8.  
  9.  
  10. function uc_api_post($module, $action, $arg = array()) { 
  11. $s = $sep = ''; 
  12. foreach($arg as $k => $v) { 
  13. $k = urlencode($k); 
  14. if(is_array($v)) { 
  15. $s2 = $sep2 = ''; 
  16. foreach($v as $k2 => $v2) { 
  17. $k2 = urlencode($k2); 
  18. $s2 .= "$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2)); 
  19. $sep2 = '&'; 
  20. } 
  21. $s .= $sep.$s2; 
  22. } else { 
  23. $s .= "$sep$k=".urlencode(uc_stripslashes($v)); 
  24. } 
  25. $sep = '&'; 
  26. } 
  27. $postdata = uc_api_requestdata($module, $action, $s); 
  28.  
  29. return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20); 
  30. } 
  31.  
  32.  
  33. function uc_api_requestdata($module, $action, $arg='', $extra='') { 
  34. $input = uc_api_input($arg); 
  35. $post = "m=$module&a=$action&inajax=2&release=".UC_CLIENT_RELEASE."&input=$input&appid=".UC_APPID.$extra; 
  36. return $post; 
  37. } 
  38.  
  39. function uc_api_url($module, $action, $arg='', $extra='') { 
  40. $url = UC_API.'/index.php?'.uc_api_requestdata($module, $action, $arg, $extra); 
  41. return $url; 
  42. } 
  43.  
  44. function uc_api_input($data) { 
  45. $s = urlencode(uc_authcode($data.'&agent='.md5($_SERVER['HTTP_USER_AGENT'])."&time=".time(), 'ENCODE', UC_KEY)); 
  46. return $s; 
  47. } 
  48.  
  49.  
  50. function uc_fopen2($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) { 
  51. $__times__ = isset($_GET['__times__']) ? intval($_GET['__times__']) + 1 : 1; 
  52. if($__times__ > 2) { 
  53. return ''; 
  54. } 
  55. $url .= (strpos($url, '?') === FALSE ? '?' : '&')."__times__=$__times__"; 
  56. return uc_fopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block); 
  57. } 
  58.  
  59. function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) { 
  60. $return = ''; 
  61. $matches = parse_url($url); 
  62. !isset($matches['host']) && $matches['host'] = ''; 
  63. !isset($matches['path']) && $matches['path'] = ''; 
  64. !isset($matches['query']) && $matches['query'] = ''; 
  65. !isset($matches['port']) && $matches['port'] = ''; 
  66. $host = $matches['host']; 
  67. $path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/'; 
  68. $port = !emptyempty($matches['port']) ? $matches['port'] : 80; 
  69. if($post) { 
  70. $out = "POST $path HTTP/1.0rn"; 
  71. $out .= "Accept: **rn"; 
  72. //$out .= "Referer: $boardurlrn"; 
  73. $out .= "Accept-Language: zh-cnrn"; 
  74. $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]rn"; 
  75. $out .= "Host: $hostrn"; 
  76. $out .= "Connection: Closern"; 
  77. $out .= "Cookie: $cookiernrn"; 
  78. } 
  79. $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout); 
  80. if(!$fp) { 
  81. return '';//note $errstr : $errno rn 
  82. } else { 
  83. stream_set_blocking($fp, $block); 
  84. stream_set_timeout($fp, $timeout); 
  85. @fwrite($fp, $out); 
  86. $status = stream_get_meta_data($fp); 
  87. if(!$status['timed_out']) { 
  88. while (!feof($fp)) { 
  89. if(($header = @fgets($fp)) && ($header == "rn" ||   $header == "n")) { 
  90. break; 
  91. } 
  92. } 
  93.  
  94. $stop = false; 
  95. while(!feof($fp) && !$stop) { 
  96. $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit)); 
  97. $return .= $data; 
  98. if($limit) { 
  99. $limit -= strlen($data); 
  100. $stop = $limit <= 0; 
  101. } 
  102. } 
  103. } 
  104. @fclose($fp); 
  105. return $return; 
  106. } 
  107. } 

远程同步登录子系统操作之后:

  1. //显示信息 
  2. function showmessage($message, $url_forward='', $second=3, $vars=array()) { 
  3. global $_SGLOBAL, $_SCONFIG, $_SC, $channels; 
  4.  
  5. if(emptyempty($_SGLOBAL['inajax']) && $url_forward && emptyempty($second)) { 
  6. //直接301跳转 
  7. obclean(); 
  8. header("HTTP/1.1 301 Moved Permanently"); 
  9. header("Location: $url_forward"); 
  10. } else { 
  11. if(!defined('IN_SUPESITE_ADMINCP')) { 
  12. $tpl_file = 'showmessage'; 
  13. $fullpath = 0; 
  14. include_once(S_ROOT.'./language/message.lang.php'); 
  15. if(!emptyempty($mlang[$message])) $message = $mlang[$message]; 
  16. } else { 
  17. $tpl_file = 'admin/tpl/showmessage.htm'; 
  18. $fullpath = 1; 
  19. include_once(S_ROOT.'./language/admincp_message.lang.php'); 
  20. if(!emptyempty($amlang[$message])) $message = $amlang[$message]; 
  21. } 
  22.  
  23. if(isset($_SGLOBAL['mlang'][$message])) $message = $_SGLOBAL['mlang'][$message]; 
  24. foreach ($vars as $key => $val) { 
  25. $message = str_replace('{'.$key.'}', $val, $message); 
  26. } 
  27. //显示 
  28. obclean(); 
  29. if(!emptyempty($url_forward)) { 
  30. $second = $second * 1000; 
  31. $message .= ""; 
  32. } 
  33.  
  34. include template($tpl_file, $fullpath); 
  35. ob_out(); 
  36. } 
  37. exit(); 
  38. } 

Supesite中的Common.php部分解读:

1、define('S_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);

dirname(__FILE__)

S_ROOT=E:mydocsupesite

2、error_reporting指令确定PHP错误报告敏感度的级别,一共有十三个预定的错误级别,每一个都唯一对应于应用程序或服务器功能。

D_BUG?error_reporting(7):error_reporting(E_ERROR);

1 E_ERROR 

2 E_WARNING 

4 E_PARSE 

8 E_NOTICE 

16 E_CORE_ERROR 

32 E_CORE_WARNING

3、$_SGLOBAL = $_SBLOCK   = $_SCONFIG = $_SHTML = $_DCACHE = $_SGET = array();

4、//基本文件

  1. if(!@include_once(S_ROOT.'./config.php')) { 
  2. header("Location: install/index.php");//安装 
  3. exit(); 
  4. } 
  5. include_once(S_ROOT.'./function/common.func.php'); 
  6. @include_once(S_ROOT.'./data/system/config.cache.php'); 

5、PHP extract() 函数从数组中把变量导入到当前的符号表中。

$_SCONFIG = array_merge($_SSCONFIG, $_SC);//合并配置

extract($_SC);

6、函数:get_magic_quotes_gpc()

取得 PHP 环境变量 magic_quotes_gpc 的值。

语法: long get_magic_quotes_gpc(void);

返回值: 长整数

函数种类: PHP 系统功能

本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。当 magic_quotes_gpc 打开时,所有的 ' (单引号), " (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。

7、过滤’单引号

  1. function saddslashes($string) { 
  2. if(is_array($string)) { 
  3. foreach($string as $key => $val) { 
  4. $string[$key] = saddslashes($val); 
  5. } 
  6. } else { 
  7. $string = addslashes($string); 
  8. } 
  9. return $string; 
  10. } 

addslashes()函数的作用是:使用反斜线引用字符串。

8、strlen()函数的作用:取字符串的长度

9、

  1. foreach($_COOKIE as $key => $val) { 
  2. if(substr($key, 0, $prelength) == $_SC['cookiepre']) { 
  3. $_SCOOKIE[(substr($key, $prelength))] = emptyempty($magic_quote) ? saddslashes($val) : $val; 
  4. } 
  5. } 

10、getenv

取得系统的环境变量

语法: string getenv(string varname);

11、php strcasecmp()函数

strcasecmp()函数的作用是:对两个字符串进行比较。

12、preg_match

13、ob_start 打开缓冲区

14、preg_replace执行正则表达式的搜索和替换

分享到:
整合Ucenter后登陆变慢,修改变快的几种方...
整合Ucenter后登陆变慢,修改变快的几种方法 1.用户登陆每次都要卡很长时间才能登陆,后来一行行代码查看,发现$ucsynlogin = uc_user_synlogin($uid);这一行代码特别慢,网上搜索uc_user_synlogin很慢,没什么结果,后来在网上有人说,把配置文件中的UC_API配置中的域名,直接用ip代替就会快些,尝...
ucenter忘记密码以后如何找回,重置更新密...
ucenter忘记密码以后如何找回,重置更新密码源码 将以下内容另存为.php格式,放在ucenter根目录即可重置修改你的管理密码,用完记得删除.
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……