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;
}