主要是两个文件。一个是uc.php。另一个是客户端的clicen.php
下面是客户端到uc.php文件的通讯。。。。其实没讲到重点。还有一个socket在里面。这个东西是我应聘的时候叫我分析的。。。只能分析到这个水平了
下面是分析过程:
UC_API常量定义。。说明这个文件只会被UC捕获和调用打开。
换句话说。UCenter会将查找像DZ论坛这样的应用文件里面是否有这个文件。并打开。调用里面的方法。
主要有两个方法执行单点登陆:
uc_api_mysql()和uc_api_post()
通过参数,$model:模块名->这个参数指向的是uc内部的mc分成的m
$action:执行的动作名-》这个参数指向的是uc内部的mc分层的c
执行的参数是一个数组。这个数组传递到控制器之中。
在UC_CONNECT=uc_api_post()的模式下是直接打开通过一系列处理(很复杂。指针啊什么的。没看明白,直接跳过去)传递 像”m=$module&a=$action&inajax=2&input=$input& appid=”.UC_APPID.$extra;形式的参数直接给服务端下的index.php文件解析。剩下的工作和下面完全相似。也是通过调用 onsnlogin()方法向另一个应用程序的uc.phh文件发出请求。虽然我看的程序很少,但我想这个是照顾没有数据库的应用与有数据库的应用也能相 互通信。
而在uc_api_mysql()是这样操作执行这个过程的:
以用户登陆为例
1、先建立一个usercontrol的对象引用-》再通过基类的load方法创建一个usermoder的对象引用到$_ENV['user']之 中=》usermoder开始链接uc的数据库,所有共享的用户信息是存 储在这里的,定义各种方法获得数据库中的内容只要control通过$_ENV['user']超级全局数组调用usermodel的方法。就返回这个属 性值内容。
2、然后调用onsynlogin()方法。经过一系列的判断后(为了保证双方是能够通信,双方的应用已经注册到uc应用列表里。具体怎么实现的没仔细 看。)发送一个js方式的链接地址 出去。链接中的code就是前面分析的uc.php所截获的cocode参数。。uc.php分解然后执行相应的数据库或者缓存等等操作。
我的理解是这样的。
应用一和应用二目录下有一个api/uc.php文件。这个文件负责处理接口。
当一在登陆的时候,调用uc_user_synlogin($uid)接口。uc_user_synlogin函数通过调用 uc_api_mysql(”user”,”synlogin”)函数开始:进行控制-》创建控制器usercontrol,控 制器告诉模块usermodel需要开始链接数据库,准备好各种调用数据库中数据的方法。直接只需要调用$_ENV['user']-》对应方法就能够调 用到对应属性值。做完这些工作后,再防 注入处理等操作后,就调用控制器的onsynlogin()方法发送一个url请求给应用二的uc.php文件。uc.php文件分解发送过来的请求,得 到动作接口为synlogin。并且获得uid的值。 以这个值为对应的用户建立在应用二下的cookie等方法创建一个标示这个用户已经登陆。整个通信结束。
通过文件分析。ucenter还有一个机制,如果客户端里面的类没有完成相应的功能,则从服务端里面的类里面抽取对应欠缺的方法。。。因为 onsynlogin是在服务端找到的。。这此 只是简单的看了一下逻辑。。。。。没有找到这个机制怎么实现的。我想核心是调用user对应的_call魔法方法。。。不知道我所猜测的是否正确。望指 正!
阅读(420) | 评论(0) | 转发(0) |