新浦京81707con > 首页 > 新京葡娱乐场:同步登录,v9代码解读

原标题:新京葡娱乐场:同步登录,v9代码解读

浏览次数:154 时间:2019-07-10

------------------------------ edit in 2011-05-11

private function _get_url() {
$sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
$php_self = $_SERVER['PHP_SELF'] ? $this->_safe_replace($_SERVER['PHP_SELF']) : $this->_safe_replace($_SERVER['SCRIPT_NAME']);
$path_info = isset($_SERVER['PATH_INFO']) ? $this->_safe_replace($_SERVER['PATH_INFO']) : '';
$relate_url = isset($_SERVER['REQUEST_URI']) ? $this->_safe_replace($_SERVER['REQUEST_URI']) : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$this->_safe_replace($_SERVER['QUERY_STRING']) : $path_info);
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}

private function _ps_post($url, $limit = 0, $post = '', $cookie = '', $ip = '', $timeout = 15, $block = true) {
$return = '';
$matches = parse_url($url);//解析URL
$host = $matches['host'];//主机名
$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';//路线及查询字符串
$port = !empty($matches['port']) ? $matches['port'] : 80;//端口
$siteurl = $this->_get_url();//获取当前页面完整USportageL地址
if($post) {//post情势提交
$out = "POST $path HTTP/1.1rn";
$out .= "Accept: **rn";
$out .= "Referer: ".$siteurl."rn";
$out .= "Accept-Language: zh-cnrn";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]rn";
$out .= "Host: $hostrn";
$out .= "Connection: Closern";
$out .= "Cookie: $cookiernrn";
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);//用socket方式张开壹个文件指针
if(!$fp) return '';

stream_set_blocking($fp, $block);//设置阻塞情势
stream_set_timeout($fp, $timeout);//设置连接时间
@fwrite($fp, $out);//把数据写入文件指针中,即发送央浼头消息
$status = stream_get_meta_data($fp);//从包装协议文本指针中取得报头/元数据,即再次来到写入的相干事态

if($status['timed_out']) return ''; //等待数据流超时
while (!feof($fp)) {//循环读取响应头音信,直到文件指针达到文件截至的职位
if(($header = @fgets($fp)) && ($header == "rn" || $header == "n")) break;//从文件指针中读取一行
}

$stop = false;
while(!feof($fp) && !$stop) {//调节是不是读取完结
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$return .= $data;
if($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
@fclose($fp);//关闭一个已张开的文书指针

//部分虚构主机再次回到数值有误,暂不明显原因,过滤再次回到数据格式
$return_arr = explode("n", $return);
if(isset($return_arr[1])) {
$return = trim($return_arr[1]);
}
unset($return_arr);

return $return;
}
七、php-socket相关
1、创建流:fopen()、fsockopen()、pfsockopen()
2、stream_set_blocking($resource,$flag)
$flag:0非阻塞,1阻塞
有个别函数读取一个网络流,当未有未读取字节时:
卡住:平素等候,直到下二个未读取的字节出现。
非阻塞:霎时告诉调用者当前从未新内容。
闭塞的补益是,排除任何非符合规律因素,阻塞的是按顺序施行的一同的读取。
3、stream_set_timeout($resource,$responseTimeout)//设置再次回到的晚点时间
4、stream_get_meta_data($resource)
//从包装协议文件指针中收获报头/元数据
(1)timed_out (bool) - 即使在上次调用 fread() 可能 fgets() 中等待数据时代风尚超时了则为 TRUE。
(2)blocked (bool) - 倘使流处于阻塞 IO 格局时为 TRUE。参见 stream_set_blocking()。
(3)eof (bool) - 假使流达到文件末尾时为 TRUE。注意对于 socket 流以至当 unread_bytes 为非零值时也可以为 TRUE。要测定是不是有越来越多多少可读,用 feof()替代读取本项目标值。
(4)unread_bytes (int) - 当前在 PHP 自身的中间缓冲区中的字节数。
5、stream_get_contents($resource)//猎取再次来到的数据流内容
6、相关函数:fwrite()、fgets()、feof()、fread()、fclose()
读字符串函数fgets函数的成效是从钦点的文书中读一个字符串到字符数组中,函数调用的款式为: fgets(字符数组名,n,文件指针);个中的n是多个正整数。表示从文件中读出的字符串不超过n-1个字符。在读入的最后三个字符后增进串截至标识'\0'。举个例子:fgets(str,n,fp);的意思是从fp所指的文本中读出n-1个字符送入字符数组str中。
fread是用来整块数据的读写函数,可用来读写一组数据,如叁个数组成分,贰个组织变量的值等。读数据块函数调用的貌似格局为: fread(buffer,size,count,fp),个中buffer是三个指针,在fread函数中,它表示贮存输入数据的首地址。 size 代表数据块的字节数。count 代表要读写的数码块块数。fp 表示文件指针。
eg:fread(fa,4,5,fp); 其意思是从fp所指的文件中,每趟读4个字节(贰个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。
7、$_POST、HTTP_RAW_POST_DATA、php://input
(1)HTTP_RAW_POST_DATA仅在碰着未识别MIME类型的数量时产生。对于enctype="multipart/form-data"表单数据不可用。
(2)访谈原始POST数据的越来越好法子是php://input
(3)php://input 允许读取 POST 的本来数据。和 $HTTP_RAW_POST_DATA 比起来,它给内部存款和储蓄器带来的压力相当的小,况且无需其余特其余 php.ini 设置。php://input 不可能用于 enctype="multipart/form-data"。

基本上$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST是同一的。但是假如post过来的数额不是PHP能够识别的,你能够用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,比如text/xml或者soap等等。

PHP默许知其余数据类型是application/x-www.form-urlencoded标准的数据类型
因此,对型如text/xml的内容不大概分析为$_POST数组,故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。
eg.
(1)phpcmsv9中phpsso_server/phpcms/modules/phpsso/classes/phpsso.class.php
if(isset($GLOBALS['HTTP_RAW_POST_DATA'])){
$this->data['avatardata'] = $GLOBALS['HTTP_RAW_POST_DATA'];
...
}
(2)phpsso_server/phpcms/modules/phpsso/index.php
file_put_contents($filename,$this->data['avatardata']);//把数据写入文件
eg.
<form action="test.php" method="post">
<input type="text" name="user">
<input type="password" name="password">
<input type="submit">
</form>
test.php
<? echo file_get_contents("php://input"); ?>
八、http协议
1、特点
简短便捷:客户向服务器央浼服务时,只需传送乞求方法和渠道。乞请方法常用的有GET、HEAD、POST。
灵活:HTTP允许传输率性档次的数码对象。正在传输的档案的次序由Content-Type加以标志。
无连接:无连接的意思是限制每一回接二连三只管理三个伸手。服务器管理完客户的呼吁,并摄取客户的答复后,即断开连接。采纳这种方法得以节约传输时间。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务管理未有纪念技能。缺乏状态意味着假诺持续处理必要前面的音信,则它必须重传,这样也许引致每一次延续传送的数据量增大。另一方面,在服务器无需先前音信时它的答问就不慢。
2、php-socket中http的伸手和响应
========== 须求头消息 ==========
Host:localhost
User-Agent:Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0
Accept:application/json, text/javascript, */*
Accept-Language:zh-cn,zh;q=0.5
Accept-Encoding:gzip, deflate
Accept-Charset:GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:115
Proxy-Connection:keep-alive
Content-Type:application/x-www-form-urlencoded
X-Requested-With:XMLHttpRequest
Referer:
Cookie:---cookie相关---
---央浼发送数据---
========== 响应头新闻 ==========
Proxy-Connection:Keep-Alive
Connection:Keep-Alive
Content-Length:112
Via 1.1 WALKISA
Date:Tue, 17 May 2011 03:26:18 GMT
Content-Type:text/html; charset=gbk
Server:nginx/0.7.67
X-Powered-By:PHP/5.2.13

function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
if($post) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
if($cookie) {
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
}
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($curl);
if (curl_errno($curl)) {
echo '<pre><b>错误:</b><br />'.curl_error($curl);
}
curl_close($curl);
return $return;
}

简单来说点的正是领略是post到哪些地点去;大家echo下$url获得

一、数据库加载:
数据库配置文件:安装时填写的数据库配置数据存款和储蓄在caches/configs/database.php

function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$matches = parse_url($url);
!isset($matches['host']) && $matches['host'] = '';
!isset($matches['path']) && $matches['path'] = '';
!isset($matches['query']) && $matches['query'] = '';
!isset($matches['port']) && $matches['port'] = '';
$host = $matches['host'];
$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
$port = !empty($matches['port']) ? $matches['port'] : 80;
if($post) {
$out = "POST $path HTTP/1.0rn";
$out .= "Accept: */*rn";
//$out .= "Referer: $boardurlrn";
$out .= "Accept-Language: zh-cnrn";
$out .= "Content-Type: application/x-www-form-urlencodedrn";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]rn";
$out .= "Host: $hostrn";
$out .= 'Content-Length: '.strlen($post)."rn";
$out .= "Connection: Closern";
$out .= "Cache-Control: no-cachern";
$out .= "Cookie: $cookiernrn";
$out .= $post;
} else {
$out = "GET $path HTTP/1.0rn";
$out .= "Accept: */*rn";
//$out .= "Referer: $boardurlrn";
$out .= "Accept-Language: zh-cnrn";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]rn";
$out .= "Host: $hostrn";
$out .= "Connection: Closern";
$out .= "Cookie: $cookiernrn";
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
if(!$fp) {
return '';//note $errstr : $errno rn
} else {
stream_set_blocking($fp, $block);
stream_set_timeout($fp, $timeout);
@fwrite($fp, $out);
$status = stream_get_meta_data($fp);
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header == "rn" || $header == "n")) {
break;
}
}
$stop = false;
while(!feof($fp) && !$stop) {
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$return .= $data;
if($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
}
@fclose($fp);
return $return;
}
}

不容置疑当有多个应用需求共同一时间会生成多串JS去调用区别的应用接口生成对应跨域的cookie;

------------------------------ edit in 2011-05-18


于是就思疑是或不是编码难点,可能文件权限难点,只怕是或不是函数不帮衬难题,经过排查开掘原本是万网的L1主机不援救fsockopen,在文件uc_client/client.php中的uc_fopen中冒出了难点,这里的代码是那样:

最终结果;是config.inc.php加个$database = 'mysql';就通讯成功;

模板缓存文件:phpcms/libs/classes/template_cache.class.php
template_compile:模板编译函数

于是modoer下的uc_client/client.php和uchome下的uc_cilent/client.php,就好像此修改了uc_open函数,呵呵,第叁回采取curl,网络的资料大概广大的,所以也绝非什么阻碍,可是就不知这些修改会不会影响别的的事物,还大概有待测量检验罗。。。。

.........................................................................................................................................................
说起底追踪到正是个主导的倡导呼吁的函数了;发起呼吁的函数用的是fsockopen;
最后数据是什么post过去的,也正是$out这些变量内容起的作用了;

二、模板深入分析:
文件:phpcms/libs/functions/global.func.php
调用:include template($module,$template);

你也许感兴趣的篇章:

  • destoon整合ucenter后登记页面不跳转的化解办法
  • destoon整合UCenter图像和文字化教育程
  • codeigniter集成ucenter1.6双向通信的消除办法
  • 单点登入 Ucenter示例深入分析
  • 关于shopex同步ucenter的redirect问题,导致script不运行
  • UCenter 批量增加用户的php代码
  • UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexists
  • UCenter中的三个可逆加密函数authcode函数代码
  • php将会员数量导入到ucenter的代码
  • UCenter Home二遍开荒指南
  • 简单来说剖判ucenter 会员同步登入通讯原理

新京葡娱乐场 1

------------------------------ edit in 2011-05-07

三、用户登入模块(phpsso关联)
1、phpcms/modules/member/index.php
登录操作:login()
...
$status = $this->client->ps_member_login($username, $password);//phpsso中判定用户登录,正确重临用户数量array
...//即便本地用户音讯荒诞不经,则插入数据,保持数据一致。
...
$synloginstr = $this->client->ps_member_synlogin($r['phpssouid']);//phpsso用户同步登入函数
//==========其他深入分析至[phpsso通信]==========

四、用户注册模块(phpsso关联)
1、phpcms/modules/member/index.php
挂号操作:register()
$this->_session_start();//加载phpcms/libs/classes/session_mysql.class.php
...
$member_setting = getcache('member_setting');//加载用户配置
...
$siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;//默认siteid为1
...
$this->_init_phpsso();//加载phpcms/modules/member/classes/client.class.php
//phpcms/base.php中load_app_class()函数的defined("ROUTE_M")来至于phpcms/libs/classes/application.class.php
...
$status = $this->client->ps_member_register($userinfo['username'], $userinfo['password'], $userinfo['email'], $userinfo['regip'], $userinfo['encrypt']);//phpsso中加多注册用户,重临phpssouid
...
$userid = $this->db->insert($userinfo, 1);//本地用户数据增加。密码加密存款和储蓄

五、后台部分整理
1、口令卡(移除)
安插文件:caches/configs/system.php

后台登录/退出:phpcms/modules/admin/index.php
后台管理:phpcms/modules/admin/admin_manage.php

口令卡类:phpcms/modules/admin/classes/card.class.php
管理员类:phpcms/modules/admin/classes/admin.class.php

语言文件:phpcms/languages/zh-cn/admin.lang.php
phpcms/languages/zh-cn/system_menu.lang.php

模板文件:phpcms/modules/admin/templates/admin_list.tpl.php
phpcms/modules/admin/templates/login_card.tpl.php
phpcms/modules/admin/templates/admin_card.tpl.php

2、后台登入
phpcms/modules/admin/classes/admin.class.php
常规下加载phpcms/libs/classes/session_mysql.class.php
...session_start();//开启session

phpcms/modules/admin/classes/admin.class.php
情景决断:check_admin()

phpcms/modules/admin/index.php
登入操作:login()
...
$_SESSION['userid'] = $r['userid'];
...
$cookie_time = SYS_TIME 86400*30;
...
param::set_cookie('userid', $r['userid'],$cookie_time);
...
//设置session和cookie

六、phpsso通讯机制
1、用户登录/注册模块中调用phpcms/modules/member/classes/client.class.php
private function _ps_send(){//调用phpsso接口地址
return $this->_ps_post($this->ps_api_url."/index.php?m=phpsso&c=index&a=".$action,500000,$this->auth_data($data));//socket情势提交post数据
}

复制代码 代码如下:

出错即便不是在同等地点,但给本身扶助不小了,

(1)index.php入库文件,并加载phpcms/base.php。
(2)index.php文件:pc_base::creat_app();
(3)phpcms/libs/classes/application.class.php:$controller = $this->load_controller();
默许加载:phpcmsmodulescontentindex.php
(4)phpcmsmodulescontentindex.php:$this->db = pc_base::load_model('content_model');
加载文件:phpcms/model/content_model.class.php
(5)phpcms/model/content_model.class.php:$this->db_config = pc_base::load_config('database');
(6)加载配置文件:caches/configs/database.php

复制代码 代码如下:

在uclogion/uc_client/client.php里的

fsockopen函数无法使用,因些就只好靠别的格局了,幸而帮衬curl,file_get_contents也支持,经思量就用curl吧,修改了uc_fopen函数,如下;

   @fclose($fp);
   return $return;
}
}

function uc_fopen2($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {

本文由新浦京81707con发布于首页,转载请注明出处:新京葡娱乐场:同步登录,v9代码解读

关键词: 新浦京81707con Discuz

上一篇:phpcms学习总结,二次开发之构建模块全过程

下一篇:没有了