首先吐槽一下discuz 的官方论坛. 你要想下载到正确版本的discuz实在不容易找到. 有兴趣本身去看吧. 就是由于这个缘由, 我原本想要安装x2.5版本(那时x3 仍是Beta版本), 结果不当心下载成了x2. 也就是不久前, x3才发布正式版. 我最近想要安装几个插件,和皮肤, 可是打开插件中心, 发现我全部的插件都安装不了, 说个人版本不支持.php
我确信是x2.5 的插件, 语言版本也没问题(我一直觉得本身的论坛是x2.5), 这就奇怪了. 我也以为discuz不会有这么明显的bug啊.网上搜了不少,都说是版本不对, 请仔细核对版本. 这问题一直困然了我好久. 当时没有紧急的需求,也就放下了.html
直到今天, 我想安装插件和皮肤, 我决定把这个安装不了插件的问题搞定. 最终仍是要核对版本, 我忽然想到好像在别人的论坛下面看到过 相似 “x2.5″ 的版权申明(就是在论坛首页的下面声明的). 再看看我本身的是 “x2″, 因此我猜想多是个人版本安装错了. 因此本地搭建php环境(wamp server), 去discuz官方仔细找到2.5的下载地址. 本地安装. 证明个人猜想是对的. 个人论坛装错了. 如今查件中心绝大部分插件和皮肤都只支持2.5和3, 因此要想装查件, 只能升级了.nginx
个人论坛已经有不少用户和数据了, 不能重装, 如今只能选择升级了. 好吧, 要升就直接升到最新x3吧. 好在官方的升级脚本仍是比较详细的, 并且我也相信discuz的实力, 官方说支持从x2直接升到x3.ajax
为了确保万无一失, 我先把服务器上的文件和数据库都备份到本地的php环境. 在本地”预升级”一次. 按照官方给的步骤,很简单就完成了. 打开页面看了一下,也没有发现问题. 放心了. 如今能够正式升级了. 欢迎你们访问个人独立博客交流: http://byNeil.comchrome
第一步: 备份服务器的全部文件 和 数据库.数据库
按照官方的说明把文件都拷贝上去: http://www.discuz.net/thread-3265731-1-1.htmlapi
由于我是用root身份登陆到vps上去的, 因此拷贝上去的文件都是属于root的, nginx 运行所使用的”www”用户是没有权限访问的. 因此要把权限都改对了,进入网站的根目录:浏览器
1
2
|
chown
www -R *
chgrp
www -R *
|
把网站的文件都改到 用户 “www” 用户的名下.缓存
此时能够开始升级了. 运行: http://xxxxxxxx.com/install/update.phpbash
问题出现了, 刚才预升级的时候, 这里就能够点下一步升级了. 可是此时提示 :
“请先升级 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文件, 找到这个提示的位置:
是这里在比版本号.
上面的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看看.
赫然发现: 通讯失败
我很清楚的记得, 原来这里是绿色的通讯成功的.
难道是由于和ucenter的通讯失败了, 才致使update.php 文件得到ucenter的版本号失败, 因此致使我升级不成功的?
想到这里, 就要跟踪为啥通讯会失败了. (百度搜ucenter 通讯失败, 不少人都说是论坛和ucenter之间的设置不一致致使的. 我也反复确认了不少次,设置没有问题.)
咱们打开chrome的调试面板, 找到检查通讯失败的地址:
点击左侧的 “应用管理”, 会发现下面这一条ajax的调用:
把这个地址在浏览器中打开:
发现他果真返回了通讯失败的字样.
从上面的url 咱们依次找到: uc_server/control/admin/app.php 文件, 并定位到 onping函数:
图中能够看到我注掉的调试代码, 都是我本身加的,为了跟踪代码的流程. 我发现流程是 进入了 “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果真被禁用了.
我这是才想起来, 前几天更换vps的时候, 没注意, 可能忘了打开fsockopen 函数了.
赶快去服务器:/usr/local/php/etc 中 打开php.ini 找到disable_functions这一行. 从中把fsockopen和pfsockopen都删掉.
而后重启php: service php-fpm restart
而后刷新上面的url, 返回通讯成功了.
好了,如今再回到开头.
把文件还原成升级前的样子, 再按照官方说明, 升级文件.
运行: http://xxxxxxxx.com/install/update.php
此次终于正常了, 显示准备完成,能够升级.
后面就比较顺利了. 自动升级数据库, 而后手动去吧缓存更新一下. 就行了.
就到这.
其中还省略了无数的弯路啊.
再次证实一个真理, 看似复杂的问题, 必定是由一个比较愚蠢的缘由形成的.