discuz 更换服务器注意事项

  1. data 目录权限
  2. uc_server/data/config.inc.php 里面的参数
  3. 调试过程,首先调通uc_server  , 可以通过采用

define(‘UC_FOUNDERPW’, ‘9b9738685d85bd3aa1c09d624e44324f’);
define(‘UC_FOUNDERSALT’, ‘733905’); 

密码是 123456789

方法是 md5(md5(“123456789″).”733905”);

如果uc_server登陆不上去,看看 /uc_server/model 中找到admin.php

function adminbase() { 里面 

$this->cookie_status = 0;

修改为

$this->cookie_status = isset($_COOKIE['sid']) ? 1 : 0;

调通uc_server 后,修改论坛的管理员密码,然后试试登陆 论坛admin.php

 

 

 

Discuz用户上传头像提示can not write to the data tmp folder。

Discuz用户上传头像提示can not write to the data tmp folder。 142513516573d35eadf807

解决方法:

通过chrome 的F12功能发现,上传图片调用 uc_server/control/user.php里面的函数 onuploadavatar,返回值是 -4,通过查找 -4的来源,

avatar1

得到 getimagesize 函数出错,返回false,

那么写一点调试代码就能看到问题所在了

avatar2

图中红圈是调试语句,根据这个的错误提示,就会发现是apache无权限读取上传的临时文件,根据提示修改apache的配置文件里面的 php_admin_value open_basedir XXXXX
通过注释掉此语句,或者修改到合适的目录使得可以读取上传文件的临时目录就可以解决此问题了。

discuz QQ登录 20003问题

出现20003问题,
qq20003-1

 

此问题主要是因为 在获取token时候

http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token

造成失败导致。

在  source/plugin/manyou/Service/Client/ConnectOAuth.php的connectGetRequestToken 里面没有正常获取,如图

qq20003-2

 

public function connectGetRequestToken($callback, $clientIp = '') {

		$extra = array();

		$extra['oauth_callback'] = rawurlencode($callback);

		if ($clientIp) {
			$extra['oauth_client_ip'] = $clientIp;
		}
 
		$this->setTokenSecret('');
		$response = $this->_request($this->_requestTokenURL, $extra);
		 
		while( trim($response) == 'error_code=20003'     )
		{
			 $response = $this->_request($this->_requestTokenURL, $extra);
		}
		
	 

		parse_str($response, $params);


		//var_dump($params);die();

		if($params['oauth_token'] && $params['oauth_token_secret']) {
			return $params;
		} else {
			
			$params['error_code'] = $params['error_code'] ? $params['error_code'] : self::RESPONSE_ERROR;
			throw new Exception($params['error_code'], __LINE__);
		}

	}

discuz 附件过多导致超出数据库的修复

今天一个朋友的discuz论坛上传图片出现无法上传情况,经过chrome F12 调试发现是数据库的附件表的aid超出了MEDIUMINT(8)的允许最大值,所以适当增大就好了,下面的sql有效

ALTER TABLE  `pre_forum_attachment` CHANGE  `aid`  `aid` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE  `pre_forum_attachment_unused` CHANGE  `aid`  `aid` BIGINT UNSIGNED NOT NULL;
ALTER TABLE  `pre_forum_attachment_0` CHANGE  `aid`  `aid` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT;
。
。
。
ALTER TABLE  `pre_forum_attachment_9` CHANGE  `aid`  `aid` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT;

phpcms 整合ucenter 的资料

首先此文甚好 http://down.chinaz.com/try/201208/2176_2.htm
需要注意的是phpcms 后台配置需要指明数据库的名字。
另外查看我之前的博文来解决在 phpcms 退出后不发出js通知到ucenter的各个系统。
如果需要在phpcms注册时候自动登陆到ucenter的discuz系统,还需要看这个博文

关于ucenter各个应用如何最快捷知道所有的app,看这里 

discuz 插件速度慢的查找方法

source/function/function_core.php
的函数 hookscript


foreach($funcs as $hookkey => $hookfuncs) {
foreach($hookfuncs as $hookfunc) {
//起始时间
$a = time()

……

//结束时间
$b = time()-$a;
echo “==========”.$b.print_r($hookfuncs,true);
}
}

通过查看===== 标记后面$b值,如果$b过大,就查看$hookfuncs 是什么造成的,从而查出哪个插件,解决方法就是了可以临时跳过那个插件

if($hookfunc[0]==”cloudsearch”) continue;
上面的cloudsearch 就是 $hookfuncs[0] 查出来的

//PS 上面的方法不一定好使,可以用下面的

测试方法 用你的测试访问两次某个地址

可以通过改变某个参数, user-agent 等来对比生成的 zjpro.txt 文件的不一致性,从而确定哪一个plungin的问题!!!!

比如

curl -v -A “百度spider的UA” http://URI

curl -v -A “正常IE的UA” http://URI

对比生成的两次zjpro.txt 文件

 

discuz X3 游客无法浏览帖子,显示帖子不存在

今天一个朋友的discuzX3 的帖子在游客状态无法打开,后台权限都给过了,所以不存在权限问题,

显示帖子不存在,经处理后解决,思路如下
地址是 thread-NNNN-1-1.html
NNNN 一般是帖子的tid , 根据显示的关键字 “没有找到帖子” 查到 post_not_found 的语言项目,在 fetch_all_by_tid_range_position 函数里面想可能是某个tid的帖子没有找到,
在那个函数里面,居然发现 $end 变量也是1,而最终追溯到 $_G[‘ppp’] 这个值是NULL,
那么问题就好处理了 设置$_G[‘ppp’] = 10 ; 解决
如果你碰到这个问题,解决不了,可以QQ 733905

一个DiscuzX的奇怪问题的解答,用户中心出错

 

出错情形如下,dz-unserialize

正常应该是这样的

dz-unserialize2

那么到底是什么出了问题呢,经过一番代码搜索,发现在数据库读取 pre_common_setting 表里面 skey = profilegroup 的svalue 值 无法反串行化 unserialize
从而无法得到数组,导致更新失败,从而无法在这里显示,究其原因,可能是dz之前是gbk版本,后来改为utf8,此字段没有正常修改,从新安装的utf8版本的discuzX 复制进去svalue 后,成功恢复。

 

nginx的discuzx伪静态

discuz X 的 nginx 伪静态规则

rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
if (!-e $request_filename) {
        return 404;
}

其他的建议去看
http://www.vpser.net/manage/nginx-rewrite.html

其它应用注册的用户在DiscuzX2.x 论坛免激活自动登录的方法

 

api/uc.php

在synlogin 函数里面增加如下代码

if(($member = getuserbyuid($uid, 1))) {

			dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);

}else{
 // 下面为增加部分

            $username = $get['username']; 
            $password = md5(time().rand(100000, 999999));
            $email = $get['email'];
            $ip = $_SERVER['REMOTE_ADDR'];
            $time = time(); 

            $userdata = array(
                'uid' => $uid,
                'username' => $username,
                'password' => $password,
                'email' => $email,
                'adminid' => 0,
                'groupid' => 10,
                'regdate' => $time,
                'credits' => 0,
                'timeoffset' => 9999
            );
            DB::insert('common_member', $userdata);

            $status_data = array(
                'uid' => $uid,
                'regip' => $ip,
                'lastip' => $ip,
                'lastvisit' => $time,
                'lastactivity' => $time,
                'lastpost' => 0,
                'lastsendmail' => 0,
            );
            DB::insert('common_member_status', $status_data);
            DB::insert('common_member_profile', array('uid' => $uid));
            DB::insert('common_member_field_forum', array('uid' => $uid));
            DB::insert('common_member_field_home', array('uid' => $uid));
            DB::insert('common_member_count', array('uid' => $uid)); 
            $query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
            if($member = DB::fetch($query)) {
                dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
            }
}

同时修改 source/class/class_member.php

在  on_register 函数里面加 登录的同步函数

uc_user_synlogin($_G['uid'])

如图

login-with-reg

 

总结一下就是:

在注册函数的成功部分加入 同步请求,同时在那些需要同步的站点改造成自动注册入数据库的功能,从而实现免登陆并且激活

思考: 任何其他程序,都可以考虑完成自己的同步登陆部分,在登陆里面完成uc的用户在本系统的注册问题

 比如

记事狗微博 /jishigou-uc-synlogin.html