记一次艰苦卓绝的Discuz x3 论坛升级过程

时间:2021-12-26 01:05:20

首先吐槽一下discuz 的官方论坛. 你要想下载到正确版本的discuz实在不容易找到. 有兴趣自己去看吧. 就是因为这个原因, 我本来想要安装x2.5版本(那时x3 还是Beta版本), 结果不小心下载成了x2.  也就是不久前, x3才发布正式版.   我最近想要安装几个插件,和皮肤, 但是打开插件中心, 发现我所有的插件都安装不了, 说我的版本不支持.

我确信是x2.5 的插件, 语言版本也没问题(我一直以为自己的论坛是x2.5), 这就奇怪了. 我也觉得discuz不会有这么明显的bug啊.网上搜了很多,都说是版本不对, 请仔细核对版本. 这问题一直困然了我很久.  当时没有紧急的需求,也就放下了.

直到今天, 我想安装插件和皮肤, 我决定把这个安装不了插件的问题搞定. 最终还是要核对版本, 我突然想到好像在别人的论坛下面看到过 类似 “x2.5″ 的版权申明(就是在论坛首页的下面声明的).  再看看我自己的是 “x2″, 所以我猜测可能是我的版本安装错了.  所以本地搭建php环境(wamp server), 去discuz官方仔细找到2.5的下载地址. 本地安装.  证实我的猜测是对的. 我的论坛装错了.  现在查件中心绝大部分插件和皮肤都只支持2.5和3, 所以要想装查件, 只能升级了.

我的论坛已经有很多用户和数据了, 不能重装, 现在只能选择升级了. 好吧, 要升就直接升到最新x3吧.  好在官方的升级脚本还是比较详细的, 而且我也相信discuz的实力, 官方说支持从x2直接升到x3.

为了确保万无一失, 我先把服务器上的文件和数据库都备份到本地的php环境. 在本地”预升级”一次.  按照官方给的步骤,很简单就完成了.  打开页面看了一下,也没有发现问题. 放心了. 现在可以正式升级了.  欢迎大家访问我的独立博客交流: http://byNeil.com

第一步: 备份服务器的所有文件 和 数据库.

按照官方的说明把文件都拷贝上去: http://www.discuz.net/thread-3265731-1-1.html

因为我是用root身份登录到vps上去的,  所以拷贝上去的文件都是属于root的,  nginx 运行所使用的”www”用户是没有权限访问的. 所以要把权限都改对了,进入网站的根目录:

1
2
chown www -R *
chgrp www -R *

把网站的文件都改到 用户 “www” 用户的名下.

此时可以开始升级了. 运行: http://xxxxxxxx.com/install/update.php

问题出现了, 刚才预升级的时候, 这里就可以点下一步升级了. 但是此时提示 :

“请先升级 UCenter 到 1.6.0 以上版本。如果使用为Discuz! X自带UCenter,请先下载 UCenter 1.6.0, 在 utilities 目录下找到对应的升级程序,复制或上传到 Discuz! X 的 uc_server 目录下,运行该程序进行升级”

(当时没顾上截图)

什么? ucenter版本不对?  不可能啊, 我已经预升级一次了.  不会啊.   于是把服务器上的文件和数据库都恢复到升级前的状态, 进ucenter看, 发现版本号的确是1.6.  所以没问题.

然后又重复官方的教程.

最后运行: http://xxxxxxxx.com/install/update.php.   还是出现一样的提示.

反复按照官方的教程做了三次, 到这都是这个提示, 我确信我没有哪一步做错了. 这就奇怪了.

于是打开update.php文件, 找到这个提示的位置:

记一次艰苦卓绝的Discuz x3 论坛升级过程

是这里在比版本号.

上面的code是我改过的, $oldversion 这个变量是我加的, 就是想把版本号显示出来, 看看到底是多少.

重新运行:  http://xxxxxxxx.com/install/update.php.

发现显示出来的版本号是空白. 什么也没有.

继续追踪: “uc_check_version” 函数, 因为版本号是从这的出来的.

搜索到uc_client/client.php

1
2
3
4
5
function uc_check_version() {
    $return = uc_api_post('version', 'check', array());
    $data = uc_unserialize($return);
    return is_array($data) ? $data : $return;
}

到了这里还是看不出来.

还是把服务器恢复原样, 和本地比看有什么却别.

恢复服务器文件和数据.

问题出在ucenter, 当然打开后台ucenter看看.

赫然发现: 通信失败

记一次艰苦卓绝的Discuz x3 论坛升级过程

我很清楚的记得,  原来这里是绿色的通信成功的.

难道是因为和ucenter的通信失败了,  才导致update.php 文件获得ucenter的版本号失败, 所以导致我升级不成功的?

想到这里, 就要跟踪为啥通信会失败了.   (百度搜ucenter 通信失败, 很多人都说是论坛和ucenter之间的设置不一致导致的. 我也反复确认了很多次,设置没有问题.)

我们打开chrome的调试面板, 找到检查通信失败的地址:

点击左侧的 “应用管理”, 会发现下面这一条ajax的调用:

记一次艰苦卓绝的Discuz x3 论坛升级过程

把这个地址在浏览器中打开:

记一次艰苦卓绝的Discuz x3 论坛升级过程

发现他果然返回了通信失败的字样.

从上面的url 我们依次找到: uc_server/control/admin/app.php 文件, 并定位到 onping函数:

记一次艰苦卓绝的Discuz x3 论坛升级过程

图中可以看到我注掉的调试代码, 都是我自己加的,为了跟踪代码的流程. 我发现流程是 进入了 “else” 块, 然后出来之后 $status就是空白.  下面在判断如果status是1表示成功. 否则就是失败.

我在本地成功的环境下, 重现类似的场景, 发现也是进入了else块, 但是出来的时候 status是1.

那就继续追踪 test_api() 这个函数.

搜索 “test_api”, 发现有两处定义, 分别在uc_client\model\misc.php  和 \uc_server\model\app.php.

第一处是空实现, 所以只能看第二处了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function test_api($url, $ip = '') {
    echo "in test pi".'<br>';
    $this->base->load('misc');
    if(!$ip) {
        $ip = $_ENV['misc']->get_host_by_url($url);
    }
            echo "line1:".$ip."<br>";
    if($ip < 0) {
        return FALSE;
    }
    echo "line2:".$ip."<br>";
    echo "line3:".$url."<br>";
    $ret = $_ENV['misc']->dfopen($url, 0, '', '', 1, $ip);
    echo "line4 ret value is:".$ret."<br>";
    return $ret;
}

上面, 我加了一些调试代码.

发现 $ret是空白.

那就是dfopen的问题了.

搜索dfopen. 他有多处实现, 但是有两处比较可疑:

\uc_client\model\misc.php 和 \uc_server\model\misc.php

我现在两个实现的入口处都设置echo语句. 发现时走的第二处.

于是进一步跟踪第二处实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    function dfopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE   , $ip = '', $timeout = 15, $block = TRUE, $encodetype  = 'URLENCODE') {
        echo "server model misc dfopen:"."<br>";
        //error_log("[uc_server]\r\nurl: $url\r\npost: $post\r\n\r\n", 3, 'c:/log/php_fopen.txt');
        $return = '';
        $matches = parse_url($url);
        $host = $matches['host'];
 
............
 
        if(function_exists('fsockopen')) {
            echo "server model misc dfopen:fsockopen"."<br>";
            $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
        } elseif (function_exists('pfsockopen')) {
            echo "server model misc dfopen:pfsockopen"."<br>";
            $fp = @pfsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
        } else {
            echo "server model misc dfopen:false"."<br>";
            $fp = false;
        }
 
................

我加了一些调试语句在里面.

当加到这里的时候,  想到,是不是 服务器的fsockopen函数被禁用了呢. 于是就没再继续加了. 赶快试. 上传文件, 刷新url.

果然输出了 “server model misc dfopen:false”

我擦, 原来是 fsockopen函数被禁用了啊.  赶快上传php的探针,  发现fsockopen果然被禁用了.

记一次艰苦卓绝的Discuz x3 论坛升级过程

我这是才想起来,  前几天更换vps的时候, 没注意, 可能忘了打开fsockopen 函数了.

赶快去服务器:/usr/local/php/etc 中 打开php.ini  找到disable_functions这一行. 从中把fsockopen和pfsockopen都删掉.

然后重启php:  service php-fpm restart

然后刷新上面的url, 返回通信成功了.

好了,现在再回到开头.

把文件还原成升级前的样子, 再按照官方说明, 升级文件.

运行: http://xxxxxxxx.com/install/update.php

这次终于正常了, 显示准备完成,可以升级.

后面就比较顺利了. 自动升级数据库, 然后手动去吧缓存更新一下. 就好了.

就到这.

其中还省略了无数的弯路啊.

再次证明一个真理,  看似复杂的问题, 一定是由一个比较愚蠢的原因造成的.

记一次艰苦卓绝的Discuz x3 论坛升级过程的更多相关文章

  1. discuz x3论坛搬家换虚拟主机完美使用教程 亲测可行 附操作步骤

    第一步:备份网站数据进入后台—站长—数据库—备份,数据备份类型选择“Discuz!和 UCenter数据”,备份成功以后,数据自动保存在data文件夹下. 第二步:网站文件下载 把整个网站文件打包(虚 ...

  2. Windows 2008 R2&plus;iis7&period;5环境下Discuz&excl;X3论坛伪静态设置方法

    2008R2不是那么的普及,加上X3版新出不久,所以伪静态的设置教程比较少,今天搞出来了,其实很简单,那么下面给大家简要说明一下.因为iis7.5集成了url重写,那就就方便多了,首先安装好你的dz论 ...

  3. discuz&excl; X3&period;4特殊字符乱码解决方案

    Discuz! X3.4升级后,帖子内容使用Unicode编码会出现直接显示源码问题 打开:source\function\function_core.php $string = str_replac ...

  4. phpcms v9和discuz X3&period;1实现同步登陆退出论坛&lpar;已实现&rpar;

    网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了.       以下网络上抄 ...

  5. phpcms 2008和discuz X3&period;1实现同步登陆退出论坛&lpar;已实现&rpar;

    网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了.       以下网络上抄 ...

  6. centos6&period;8安装Discuz&excl;X3&period;1&lpar;PHP论坛&rpar;

    1.首先搭建apache+mysql+php环境: 一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysq ...

  7. Discuz&excl; X3搬家后UCenter出现UCenter info&colon; MySQL Query Error解决方案

    Discuz! X3 X2.5论坛搬家后 登录UCenter出现报错:UCenter info: MySQL Query ErrorSQL:SELECT value FROM [Table]vars ...

  8. discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法

    discuz x3在DIY模块中调用伪静态不成功,显示动态链接,然而其他的链接正常显示伪静态. 后台启用伪静态后,发现论坛版块.帖子点击链接,伪静态正常显示,然后在门户首页DIY显示的帖子,点进去后发 ...

  9. 去掉删除discuz x3&period;2 的-Powered by Discuz&excl;

    如图discuz论坛 网站标题栏的尾巴powered by discuz!是不是很想删除呢,特别是为什么会剩下短线呢?下面就叫你如何准确删除或者修改. 工具/原料 8UFTP(使用自己熟悉的网站文件上 ...

随机推荐

  1. 1-1 node 基础

    1.什么是nodejs?   简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js ...

  2. 课前HTML基础

    一..站点的建立 作用:用来归纳一个网站上所有的网页,素材以及他们之间的联系. 站点根文件夹的命名规则:必须是以英文或者下划线开头,后面可接数字和下划线,不可以使用中文和特殊字符. 二:创建HTML页 ...

  3. C&num;函数式程序设计之用闭包封装数据

    如果一个程序设计语言能够用高阶函数解决问题,则意味着数据作用域问题已十分突出.当函数可以当成参数和返回值在函数之间进行传递时,编译器利用闭包扩展变量的作用域,以保证随时能得到所需要的数据. C#函数式 ...

  4. 【OpenCV】立体匹配算法SSD、NCC、ASW的基础实现

    要求:对给出的左右视图进行匹配,最后输出左右两张disparity map(视差图) e.g. 左视图.右视图(两幅图像大小相同,只有水平方向上的视角变换)   标准视差图如下:   SSD(sum ...

  5. WPF视频教程系列笔记

    视频二:XAML基础 1.*元素 <Window></Window>,<Page></Page>,<Application></Ap ...

  6. java 读写锁

    http://tutorials.jenkov.com/java-concurrency/read-write-locks.html 翻译 读写锁比LOCK的实现更复杂,想象有一个应用程序能读和写一些 ...

  7. oepn sync

    http://blog.csdn.net/cywosp/article/details/8767327 SYNOPSIS #include <sys/types.h> #include & ...

  8. IAR Embedded Workbench for ARM 6&period;50&period;6 &amp&semi; 6&period;60&period;1 破解补丁

    IAR EWARM 6.50.6 & 6.60.1 破解 破解原理和方法见:http://blog.csdn.net/chivalrys/article/details/8564568 IAR ...

  9. 打开 chm 帮助文件显示空白及解决方法

    有个很奇葩的解决方法:把 chm 文件用压缩软件压缩,然后用压缩软打开此压缩包,直接双击压缩包里面的 chm 文件 这虽然解决了问题,但是这不科学…… 分析:直接打开压缩包里面的文件,压缩包的文件是临 ...

  10. mknod用法以及主次设备号【转】

    转自:http://www.cnblogs.com/hnrainll/archive/2011/06/10/2077583.html mknod 用途 创建特殊文件. mknod Name { b | ...