tohokuaikiのチラシの裏

技術的ネタとか。

MediaWikiのifExistsではまる

MediaWiki基本的な拡張パーサに:ParserFunctionsってのがあるんだけど、これがどうも動かない。

SVNのRevision 35157 のParserFunctions.phpなんだけど、

<?php
	function ifexistCommon( &$parser, $frame, $title = '', $then = '', $else = '' ) {
		$title = Title::newFromText( $title );
		if ( $title ) {
			if( $title->getNamespace() == NS_MEDIA ) {
 ... .zip ...
			} else {
				$pdbk = $title->getPrefixedDBkey();
				$lc = LinkCache::singleton();
				if ( !$this->incrementIfexistCount( $parser, $frame ) ) {
					return $else;
				}
				if ( $lc->getGoodLinkID( $pdbk ) ) {

どうも
if ( !$this->incrementIfexistCount( $parser, $frame ) ) {
があやしい。

この関数って、処理の重い関数を実行するたびに内部カウンタをあげて、一定数以上は処理しないってなってるんだけど。

<?php
	function incrementIfexistCount( $parser, $frame ) {
		// Don't let this be called more than a certain number of times. It tends to make the database explode.
		global $wgExpensiveParserFunctionLimit;
		$parser->mExpensiveFunctionCount++;
		if ( $frame ) {
			$pdbk = $frame->getPDBK( 1 );
			if ( !isset( $parser->pf_ifexist_breakdown[$pdbk] ) ) {
				$parser->pf_ifexist_breakdown[$pdbk] = 0;
			}
			$parser->pf_ifexist_breakdown[$pdbk] ++;
		}
		return $parser->mExpensiveFunctionCount <= $wgExpensiveParserFunctionLimit;
	}

この最後の比較している
$parser->mExpensiveFunctionCount と $wgExpensiveParserFunctionLimit;
の値がないんだよね・・・・。

だから絶対falseになるんだが。

しょうがないから

<?php
	function incrementIfexistCount( $parser, $frame ) {
                return true;
		// Don't let this be called more than a certain number of times. It tends to make the database explode.

してしまった。