首先吐槽一下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
此次終於正常了, 顯示準備完成,能夠升級.
後面就比較順利了. 自動升級數據庫, 而後手動去吧緩存更新一下. 就行了.
就到這.
其中還省略了無數的彎路啊.
再次證實一個真理, 看似複雜的問題, 必定是由一個比較愚蠢的緣由形成的.