首页 > cms建站系统 > discuz

ucenter整理tipask问答系统与discuz单项同步问题解决方法

发布时间:2016-11-25 17:21

UCenter是Comsenz旗下各个产品之间信息直接传递的一个桥梁,通过UCenter 站长可以无缝整合Comsenz系列产品,实现用户的一站式登录以及社区其他数据的交互,但很多站长在使用它时会碰到一些问题了,下文就ucenter整理tipask问答系统与discuz单项同步问题解决方法

今天整合了一下论坛discuz+问答系统tipask,按照官方后台操作配置了ucenter,实现的会员数据同步的功能
后来测试发现,只有从tipask(登录、注册)可以同步到discuz
从discuz登录确不能同步到tipask上面,于是在网上找了很多资料,也有很多网友出现了跟我一样的问题;都没有解决
实在没办法了,只能一点点的解读代码
发现uc_client下的client.php文件有这样一段话
====================================

 代码如下 复制代码
function uc_user_synlogin($uid) {
    $uid = intval($uid);
    if(@include UC_ROOT.'./data/cache/apps.php') {
        if(count($_CACHE['apps']) > 1) {
            $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
        } else {
            $return = '';
        }
    }
    return $return;
}

====================================
上面意思是只有应用数大于一才会执行其他同步操作
于是去找了一下/data/cache/apps.php这个文件发现了问题;
默认配置好tipask+discuz的时候,这个文件并没有增加应用数,以前默认只有一个,下面那个应用是我手动加上了,
====================================

 代码如下 复制代码
<?php
$_CACHE['apps'] = array (
  1 =>
  array (
    'appid' => '1',
    'type' => 'DISCUZX',
    'name' => 'Discuz! Board',
    'url' => 'http://127.0.0.12',
    'ip' => '',
    'viewprourl' => '',
    'apifilename' => 'uc.php',
    'charset' => '',
    'dbcharset' => '',
    'synlogin' => '1',
    'recvnote' => '1',
    'extra' => false,
    'tagtemplates' => '',
    'allowips' => '',
  ),
  2 =>
  array (
    'appid' => '2',
    'type' => 'OTHER',
    'name' => 'ask',
    'url' => 'http://127.0.0.12/ask',
    'ip' => '',
    'viewprourl' => '',
    'apifilename' => 'uc.php',
    'charset' => '',
    'dbcharset' => '',
    'synlogin' => '1',
    'recvnote' => '1',
    'extra' => false,
    'tagtemplates' => '',
    'allowips' => '',   
  ), 
);
?>

=============================
上面的相关配置需要根据实际配置修改,这样问题就解决了;

读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位。

在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。
需求需求
有一个800M的日志文件,大约有500多万行, 用PHP返回最后几行的内容。
实现方法
1. 直接采用file函数来操作
由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,则内存使用量不受限制。
下面是一段用file来取出这具文件最后一行的代码:

 代码如下 复制代码
<?php
ini_set('memory_limit', '-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data) - 1];
echo $line;
?>

整个代码执行完成耗时 116.9613 (s)。
我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万 不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了。
2.直接调用Linux的 tail 命令来显示最 后几行
在Linux命令行下,可以直接使用 tail -n 10 access.log 很轻易的显示日志文件最后几行,可以直接用PHP来调用tail命令,执行PHP代码如下:

 代码如下 复制代码
<?php
$file = 'access.log';
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n 1 $file`;
echo $line;
?>

整个代码执行完成耗时 0.0034 (s)
3. 直接使用PHP的 fseek 来进行文件操作
这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是直接通过指针来操作,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法:
方法一
首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置, 再取这一行的位置,依次类推,直到找到了$num行。
#实现代码如下

 代码如下 复制代码
<?php
$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0)
{
 while ($t != "\n")
 {
  fseek($fp, $pos, SEEK_END);
  $t = fgetc($fp);
  $pos--;
 }
 $t = " ";
 $data .= fgets($fp);
 $line--;
}
fclose($fp);
echo $data
?>

整个代码执行完成耗时 0.0095 (s)
方法二
还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换 行符(\n)的个数来判断是否已经读完最后$num行数据。
#实现代码如下

 代码如下 复制代码
<?php
$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;
$fs = sprintf("%u", filesize($file));
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);
for ($len = 0; $len < $max; $len += $chunk)
{
 $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;
 fseek($fp, ($len + $seekSize) * -1, SEEK_END);
 $readData = fread($fp, $seekSize) . $readData;
 if (substr_count($readData, "\n") >= $num + 1)
 {
  preg_match("!(.*?\n){" . ($num) . "}$!", $readData, $match);
  $data = $match[0];
  break;
 }
}
fclose($fp);
echo $data;
?>

整个代码执行完成耗时 0.0009(s)。

方法三

 代码如下 复制代码

<?php
function tail($fp, $n, $base = 5)
{
 assert($n > 0);
 $pos = $n + 1;
 $lines = array();
 while (count($lines) <= $n)
 {
  try
  {
   fseek($fp, -$pos, SEEK_END);
  }
  catch (Exception $e)
  {
   fseek(0);
   break;
  }
  $pos *= $base;
  while (!feof($fp))
  {
   array_unshift($lines, fgets($fp));
  }
 }

 return array_slice($lines, 0, $n);
}

var_dump(tail(fopen("access.log", "r+"), 10));
?>

整个代码执行完成耗时 0.0003(s)

方法四,PHP的stream_get_line函数 ,读取快速,读取50万条数据大文件,大概需要20秒左右的时间!例子代码如下

 代码如下 复制代码
$fp = fopen('./iis.log', 'r'); //文件
while (!feof($fp)) {
 //for($j=1;$j<=1000;$j++) {         //读取下面的1000行并存储到数组中
  $logarray[] = stream_get_line($fp, 65535, "\n");
        // break;
  // }
 
 }
cmd命令行下运行php文件的前提是我们必须要在运行机器安装了php环境才可以利用cmd调用php.exe文件来实现执行指定文件了,具体方法如下。

最近需要用的socket,服务端需要在命令行下运行,怎么样在命令行下运行php文件呢?
window 7解决方案,XP没试,不过想来也是同理,差不了多少
1、你的php.exe文件的路径,比如d:\php5.3\
2、打开计算机右键 > 属性 > 高级系统设置 > 高级 > 环境变量
3、在系统变量中找到Path看看有没有你的php路径,如果没有,则在Path中加入你的php路径,如:d:\php5.3\,保存即可
4、在cmd命令行下进入到你的站点目录,直接输入文件名即可,如:F:\www\socket>php.exe s.php

我们在很多的公共网站中都会有碰到显示用户的IP时后面几个IP段显示为星号了,这样很好的保护了用户隐私了,下面我总结了些例子,大家看看吧。

php正则格式化IP地址,隐藏后一位。

例子

 代码如下 复制代码

<?php
//隐藏后一位
return preg_replace('/(\d+)\.(\d+)\.(\d+)\.(\d+)/is',"$1.$2.$3.*",$ip);
 
//隐藏IP最后几位为*
echo ereg_replace("[^\.]{1,3}$","*",$ip);
?>

例子

php实现隐藏Ip地址最后一段或者最后两段的方法

 

 代码如下 复制代码
<?
//--隐藏IP后几位
$ip='127.0.0.1';
$reg1='/((?:\d+\.){3})\d+/';
$reg2='~(\d+)\.(\d+)\.(\d+)\.(\d+)~';
echo preg_replace($reg1,"\\1*",$ip);//以上输出结果为:127.0.0.*
echo "------------------<br/>";
echo preg_replace($reg2,"$1.$2.*.*",$ip);//以上输出结果为:127.0.*.*
?>

例子

 代码如下 复制代码

function suohao($phone){
$p = substr($phone,0,3)."*****".substr($phone,8,3);
return $p;
}

当然还有像数组以.分开之后把数组2,3进行替换就可以了或组合0,1数组就可以了。

今天公司在做一个数据与app对接的功能,对方转过来的是json转义之后的数据,但又不是标准的json格式化数据,我们直接使用json_decode是输入原字符了,下面一起来看年解决办法吧。

代码如下

\u5c0f\u533a\u7eff\u5316\u5f88\u4e0d\u9519|||\u4e8c\u671f\u4ec0\u4e48\u65f6\u5019\u4ea4\u623f\u7684|||\u4e8c\u671f\u4ea4\u623f\u4e86|||\u548c\u683c\u6797\u4e91\u5885\u79bb\u5f97\u5f88\u8fd1|||\u5730\u7406\u4f4d\u7f6e

上面代码有人能看懂吗?我估计没人了,我知道是json了所以取一段出来测试

 代码如下 复制代码

echo json_decode('u683c\u8fd8\u4e0d\u9519');

发现什么出没有输入,后来想这个不是标准json我们可以使用一个数组再转换看一下

 代码如下 复制代码

$array =array('u683c\u8fd8\u4e0d\u9519');
echo json_encode( $array ) ;

得到结果是

["u683c\\u8fd8\\u4e0d\\u9519"]

这不是标准json格式数据吧,于时我再进一步解析

 代码如下 复制代码

$array = json_decode('["\u4e8c\u671f\u4ec0\u4e48\u65f6\u5019\u4ea4\u623f\u7684"]');

print_r($array );

(
    [0] => 浜???浠€涔??跺??浜ゆ?跨??
)

是乱码呀,这个我估计是编码问题,我知道json转换编码是uft8的而我页面是gbk了,于时找到iconv函数

 代码如下 复制代码

$array = json_decode('["\u4e8c\u671f\u4ec0\u4e48\u65f6\u5019\u4ea4\u623f\u7684"]');

echo iconv('utf-8','gbk',$array[0]);

得出结果是

二期什么时候交房的

这样就成功把乱码转换成中文了哦,大家试一下

本站原创教程:转载注明来源http://www.111cn.net

标签:[!--infotagslink--]

您可能感兴趣的文章: