Mediawiki 程式說明:修訂版本之間的差異
出自六年制學程
(→includes/Title.php) |
(→includes/parser/Parser.php) |
||
第 12 行: | 第 12 行: | ||
==includes/parser/Parser.php== | ==includes/parser/Parser.php== | ||
本程式為 wiki 語法解析的核心。 | 本程式為 wiki 語法解析的核心。 | ||
+ | |||
+ | 負責取回跨 wiki 內容的方法發生問題,結果傳回[抱歉,模板https://zh.wikibooks.org/wiki/%E5%88%9D%E4%B8%AD%E6%95%B8%E5%AD%B8/%E6%A0%B9%E8%99%9F?action=render讀取失敗]。將有問題段落列在後面: | ||
+ | function fetchScaryTemplateMaybeFromCache( $url ) { | ||
+ | global $wgTranscludeCacheExpiry;// 跨 wiki 快取生命週期,為 3600 秒,即一小時 | ||
+ | $dbr = wfGetDB( DB_SLAVE ); | ||
+ | // 暫存條件:目前時間減跨 wiki 快取生命週期 | ||
+ | $tsCond = $dbr->timestamp( time() - $wgTranscludeCacheExpiry ); | ||
+ | // 取transcache表tc_time及tc_contents欄,條件為tc_url為$url且tc_time長於暫存條件 | ||
+ | $obj = $dbr->selectRow( 'transcache', array( 'tc_time', 'tc_contents' ), | ||
+ | array( 'tc_url' => $url, "tc_time >= " . $dbr->addQuotes( $tsCond ) ) ); | ||
+ | // 如果找到快取內容,傳回 | ||
+ | if ( $obj ) { | ||
+ | return $obj->tc_contents; | ||
+ | } | ||
+ | // 執行includes/HttpFunctions.php中MWHttpRequest類別的factory方法,以產生 HTTP 的請求物件 | ||
+ | $req = MWHttpRequest::factory( $url ); | ||
+ | // 執行請求,會得到結果狀態物件 | ||
+ | $status = $req->execute(); // Status object | ||
+ | // 執行請求後取回的內容是空值 | ||
+ | $text = $req->getContent(); | ||
+ | // 執行請求後,結果狀態不是 OK,所以$text得到空值 | ||
+ | if ( $status->isOK() ) { | ||
+ | $text = $req->getContent(); | ||
+ | // 執行請求後,getStatus()得 200 ,所以scarytranscludefailed-httpstatus錯誤提示不會執行 | ||
+ | } elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless. | ||
+ | return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text(); | ||
+ | // 執行請求後,getStatus()得 200 ,所以傳回[抱歉,模板https://zh.wikibooks.org/wiki/%E5%88%9D%E4%B8%AD%E6%95%B8%E5%AD%B8/%E6%A0%B9%E8%99%9F?action=render讀取失敗] | ||
+ | } else { | ||
+ | return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text(); | ||
+ | } | ||
+ | // 以下更新跨 wiki 快取的欄值 | ||
+ | $dbw = wfGetDB( DB_MASTER ); | ||
+ | $dbw->replace( 'transcache', array( 'tc_url' ), array( | ||
+ | 'tc_url' => $url, | ||
+ | 'tc_time' => $dbw->timestamp( time() ), | ||
+ | 'tc_contents' => $text) | ||
+ | ); | ||
+ | // 執行請求後,結果狀態如果是OK,傳回$text | ||
+ | return $text; | ||
+ | } |
2013年10月27日 (日) 16:25的修訂版本
includes/Title.php
而Title類中 getLocalURL 方法中負責處理 interwiki 的部分有錯,因{{…}}的關係,造成 $namespace 變成 Template ,使URL插入多餘的「Template:」,需抑制修改:
#$namespace = $this->getNsText(); #if ( $namespace != ) { # Can this actually happen? Interwikis shouldn't be parsed. # Yes! It can in interwiki transclusion. But... it probably shouldn't. # $namespace .= ':'; #} #$url = $interwiki->getURL( $namespace . $this->getDBkey() );// by jj
includes/parser/Parser.php
本程式為 wiki 語法解析的核心。
負責取回跨 wiki 內容的方法發生問題,結果傳回[抱歉,模板https://zh.wikibooks.org/wiki/%E5%88%9D%E4%B8%AD%E6%95%B8%E5%AD%B8/%E6%A0%B9%E8%99%9F?action=render讀取失敗]。將有問題段落列在後面:
function fetchScaryTemplateMaybeFromCache( $url ) { global $wgTranscludeCacheExpiry;// 跨 wiki 快取生命週期,為 3600 秒,即一小時 $dbr = wfGetDB( DB_SLAVE ); // 暫存條件:目前時間減跨 wiki 快取生命週期 $tsCond = $dbr->timestamp( time() - $wgTranscludeCacheExpiry ); // 取transcache表tc_time及tc_contents欄,條件為tc_url為$url且tc_time長於暫存條件 $obj = $dbr->selectRow( 'transcache', array( 'tc_time', 'tc_contents' ), array( 'tc_url' => $url, "tc_time >= " . $dbr->addQuotes( $tsCond ) ) ); // 如果找到快取內容,傳回 if ( $obj ) { return $obj->tc_contents; } // 執行includes/HttpFunctions.php中MWHttpRequest類別的factory方法,以產生 HTTP 的請求物件 $req = MWHttpRequest::factory( $url ); // 執行請求,會得到結果狀態物件 $status = $req->execute(); // Status object // 執行請求後取回的內容是空值 $text = $req->getContent(); // 執行請求後,結果狀態不是 OK,所以$text得到空值 if ( $status->isOK() ) { $text = $req->getContent(); // 執行請求後,getStatus()得 200 ,所以scarytranscludefailed-httpstatus錯誤提示不會執行 } elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless. return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text(); // 執行請求後,getStatus()得 200 ,所以傳回[抱歉,模板https://zh.wikibooks.org/wiki/%E5%88%9D%E4%B8%AD%E6%95%B8%E5%AD%B8/%E6%A0%B9%E8%99%9F?action=render讀取失敗] } else { return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text(); } // 以下更新跨 wiki 快取的欄值 $dbw = wfGetDB( DB_MASTER ); $dbw->replace( 'transcache', array( 'tc_url' ), array( 'tc_url' => $url, 'tc_time' => $dbw->timestamp( time() ), 'tc_contents' => $text) ); // 執行請求後,結果狀態如果是OK,傳回$text return $text; }